Forum: PC-Programmierung Merkwürdiges Problem


von Wild (Gast)


Lesenswert?

Hallo liebe Code-Gemeinschaft ;)
Ich stehe vor einem verwirrenden Problem.
Wenn ich diesen Code
1
bool RahmenInfo::writein_rahmen(unsigned int x , unsigned int y ,const char *string)
2
{
3
    if((strlen(string)>(xmax-x)) || x>xmax || y>ymax) return false;
4
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),23);
5
    mygotoxy(koordinaten.X+x-1,koordinaten.Y+y-1);
6
    puts(string);
7
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
8
    return true;
9
}
auf meinem alten Rechner kompiliere , dann macht er seit neuestem NICHTS 
beim mygotoxy (nur in dieser Funktion). Bei meinem neuen Rechner 
funktioniert alles bestens. An welchen Faktoren könnte das liegen?
Lg Wild

von Wild (Gast)


Lesenswert?

Sorry. Hab grade gemerkt , dass beim  zweiten Anlauf das gleiche 
passiert.
Aber eine andere Frage:
Beim Aufruf unterer Funktion(en) werden total unbeteiligte (private) 
Klassendaten verändert. Vielleicht weil ich alte C-Funktionen in C++ 
benutze??
1
bool fsetposto(FILE *stream,char character,fpos_t *position)
2
{
3
    if(stream==NULL) return false;
4
    char c=((character==0)?1:0);
5
    fseek(stream,-1L,SEEK_END);
6
    while(c!=character)
7
    {
8
        fseek(stream,-1L,SEEK_CUR);
9
        c=fgetc(stream);
10
        ungetc(c,stream);
11
        if(c==-1) return false;
12
    }
13
    fseek(stream,1L,SEEK_CUR); //Um eine Stelle nach dem Gefundenen einzusetzen
14
    fgetpos(stream,&(*position));
15
    return true;
16
17
}
18
19
bool tailto(FILE *stream,char *string,char character)
20
{
21
    if(fsetposto(stream,character,NULL))
22
    {
23
        if(character==10) fseek(stream,1L,SEEK_CUR);
24
        fgets(string,1024,stream);
25
        return true;
26
    }
27
    else return false;
28
}

von Εrnst B. (ernst)


Lesenswert?

Wild schrieb:
> fgetpos(stream,&(*position));

Kommt mir Spanisch vor, besonders weil:

> fsetposto(stream,character,NULL)

position mit "NULL" vorbelegt.

von Wild (Gast)


Lesenswert?

Ja bei dem Aufruf interssiert mich die Position ja gar nich. deshalb hab 
ich halt n Null-Pointer gelegt.

von Εrnst B. (ernst)


Lesenswert?

Kann man ja machen.... dann aber:
1
 
2
  if (position)
3
     fgetpos(stream,position);

von Wild (Gast)


Lesenswert?

Naja. Mag sein dass das fehlerunanfälliger ist , aber der eigentliche 
Bug und zwar das Verändern von völlig unbeteiligten Daten besteht 
immernoch.
Lg Wild

von Εrnst B. (ernst)


Lesenswert?

> eigentliche Bug

Impliziert das aufrufen von fgetpos mit NULL-Ponter kein "echter Bug" 
ist.
Dem ist nicht so. Danke der Weitsicht deiner libc-Implementatoren, dass 
die deinen Fehler für dich ausgebügelt haben, obwohl sie (laut 
POSIX/ANSI) nicht mussten.

d.H. du hast noch einen zweiten Bug, der das von dir beobachtete 
Verhalten verursacht:

prüf noch deine anderen Pointer. z.B. "string", zeigt das immer auf 
einen passend großen Buffer?

von Wild (Gast)


Lesenswert?

Also nachdem ich das Objekt als global eigestuft hab fuktioniert alles 
:).
Jetzt hab ich WIEDER ne Frage:
Wie kann ich eine Datei von 2 Programmen gleichzeitig "bearbeiten" 
lassen?
Es ist SEHR DRINGEND!
Lg Wild

von Εrnst B. (ernst)


Lesenswert?

Wild schrieb:
> Also nachdem ich das Objekt als global eigestuft hab fuktioniert alles
> :).

d.H. Dein Objekt liegt jetzt woanders im Ram, deine fehlerhafte Funktion 
schreibt immer noch wild irgendwo am Stack herum, aber es fällt jetzt 
nicht mehr sofort auf?
Ich seh schon: Dieses Projekt wird dir noch viel Freude bereiten.

> Wie kann ich eine Datei von 2 Programmen gleichzeitig "bearbeiten"
> lassen?

Normalerweise ergibt sich das Problem nicht: Per default können zwei 
Programme dieselbe Datei bearbeiten. Man muss nur Vorkehrungen (locking) 
treffen, wenn man das eben nicht will.
Mag aber sein, dass das unter Windows anders läuft...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.