Komunikacja z programem C#, wyjście

0

Piszę w rozpaczy. Chyba nikt mi już nie pomoże ale spróbować nie zaszkodzi. Piszę prosty parser w czystym c który parsuje pewien plik i wyniki wyrzuca na wyjście które z kolei jest czytane przez program napisany w C#. Program w c uruchamiany jest z poziomu C# przez:

p = new System.Diagnostics.Process();
p.StartInfo.FileName = "c:\...";

i później piszę w c przez printf i używam co chwilę fflush. Natomiast to wszystko czytam w C# przez
p.StandardOutput.ReadLine();
Czasem też chcę pisać w C# a czytać w C ale do tego jeszcze nie doszedłem.

W każdym razie w pewnym momencie przesył siada. Tzn znalazłem w programie funkcję na której to wszystko się zatrzymuje. Jest tam taka pętla w przybliżeniu:

void foo(int start, int stop)
{
for(i = start; i <= stop; i++)
{
printf(...):
fflush(std...
}
}

Te pare linijek jest w funkcji która jest wywoływana w main, start i stop to parametry wynoszące 0 i 2 w tym przypadku. Po wywołaniu tej funkcji, program w C# otrzymuje dziwny token tak jakby pusty i dalej nie może pracować. Natomiast co bardzo dla mnie dziwne jeżeli tą linijkę :
for(i = start; i <= stop; i++)
zastąpię taką:
for(i = 0; i <= 2; i++)
Czyli podstawie za zmienne te same wartości które one faktycznie mają przy tym wywołaniu to wszystko działa poprawnie, napis zostaje wysłany tak jak trzeba, ja jestem w kropce, szukam i szukam ale przyczyny znaleźć nie mogę. Rozpacz. Pomóżcie co tutaj może być źle.

Jest tu coś z tymi parametrami, ponieważ jeżeli dam takie coś:

void foo(int start, int stop)
{
int sto = stop;
int sta = start;
for(i = sta; i <= sto; i++)
{
printf(...):
fflush(std...
}
}

to też działa ale nie mogę tak zmienić każdej pętli bo mam tutaj sporo zagnieżdzonych różnych wynalazków.

0

Przybliżony kod nic tu nie da - załącz całośc tak jak jest kompilowana - jeśli nie jest za duża.
Btw powinno być

for(int i = start; i <= stop; i++)

i nie wiem czy to tylko w pioście jest źle czy w kodzie tez tak masz.

Wygląda to tak jakbyś miał przepełnienie bufora i nadpisujesz wartości tych zmiennych.

0

Oczywiście mam w kodzie ok, inaczej bym nie skompilował.
Cały kod w C ma 1000 lini a w C# 900 więc nie ma co wklejać. Problem jest w tych miejscach które wyszczególniłem.

0

Pomyłka, ostatni podany przeze mnie kod nie zgadza się.
działa w takim przypadku:

void foo(int start, int stop)
{
int sto = 0;
int sta = 2;
for(i = sta; i <= sto; i++)
{
printf(...):
fflush(std...
}
}

Oczywiście przy pierwszym uruchomieniu parametry start i stop mają właśnie wartości 0, 2. Sprawdziłem już wszystko. W oknie konsoli wszystko wygląda bardzod obrze tzn jeżeli robię te modyfikacje pozwalające na to żeby to wszystko działało to w konsoli widzę te same komunikaty jak wcześniej a jednak coś działa.

0

Oczywiście przy pierwszym uruchomieniu parametry start i stop mają właśnie wartości 0, 2

Dlaczego masz start i stop, a obok sta i sto? Czymkolwiek by się nie różniły, takie nazewnictwo skutkuje nieczytelnym kodem.

0

autor: Wiec wrzuc pelen kod, cale 1000 linii, na pastebina i podaj tutaj link do tegoż kodu.

Jeżeli po przepisaniu parametrow int-start-stop do zmiennych lokalnych nagle zaczelo dzialac, to opcja pozostaje praktycznie tylko jedna - gdzies jakims przypadkiem czytasz/piszesz spoza zakresu tablicy [lub jakis watek Ci sie wcina - ale to nie tutaj, gdyz masz argumenty przekazywane w 100% przez wartosc]

Jezeli natomiast przepisanie nic nie dalo, a musiales je zhardcode'owac - to pewnie Twoja funkcja dostaje NIEprawidlowe wartosci argumentow, np. zamiast 0/2 dostaje 4/20 i dalej glupieje. Zamiast wpisywac wartosci na sztywno, postaw jakis prosty test w stylu:
if(start != 0 || stop != 2) { printf("FAAAILLL"); }
i postaw sobie breakpointa w srodku tego IF'a. Breakpoint zlapany = FAIL w funkcji ktora wywolala te funkcje, gdyz wywolala ja z blednymi argumentami..

Azarien: to jest kod tymczasowy, dla testu zachowania, wiec pal to licho. Przelec przez reszte watku, zobaczysz o co biega.

0

Przepraszam wszystkich za zamieszanie. Jednak błąd był prozaiczny, ale siedziałem nad nim od 2 dni :/

Otóż faktycznie parametry były złe. Kiedy testowałem wszystko debuggerem tak jak sugerował quetzalcoatl już dwa dnie temu wszystko było dobrze, argumenty wszędzie te co trzeba i komunikaty takie jak trzeba. A uruchamiając parser z poziomu programu w C# otrzymywałem parę komunikatów dobrych a potem dupa a to dlatego że parser czyta plik i ścieżka do tego pliku nie była absolutna tylko "plik.txt" i po prostu uruchamiając go z innego programu o innej lokalizacji nie znajdował tego pliku. A że komunikacja między programami działała przez stdio / stdout to wyłączyłem z parsera wszystkie komunikaty typu właśnie ostrzeżenie o nieznalezieniu pliku... szkoda gadać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1