realloc aber wie zum zweiten...
-
dachschaden_off schrieb:
Ich habe bei einem mittelgroßen Projekt den Compiler auf C umgestellt (VS 2010). ... (was ich gut finde, der GCC ist da meines Erachtens zu nachlässig). Aber VS meckert auch, wenn ich den Cast nicht mache.
Quatsch.
Der Fehler liegt nicht bei den Compilern, du bist nicht in der Lage, diese richtig zu bedienen.
-
OkkaPapa schrieb:
Der Punkt ist, daß realloc in meinem Code (lesbar oder nicht) einen gültigen Zeiger zurückliefert und ich dann später einen core dump bekomme.
Dann veränderst du den Zeiger zwischen den beiden Codestellen.
Gehe davon aus, dass in jedem Fall du die Fehlerursache bist und durch unleserlichen+unstrukturierten Code dir selbst die Sache schwer machst.
Gebe direkt nach dem 1. Mal realloc eine Debugausgabeprintf("%d",Grid[i].PosCoord)
aus und dann immer weiter bis zum core-dump, da du ja offensichtlich keinen Debugger benutzen willst/kannst.
calloc initialisiert übrigens mit 0, realloc aber nicht, das solltest du wissen.
-
Wutz schrieb:
OkkaPapa schrieb:
Der Punkt ist, daß realloc in meinem Code (lesbar oder nicht) einen gültigen Zeiger zurückliefert und ich dann später einen core dump bekomme.
Dann veränderst du den Zeiger zwischen den beiden Codestellen.
Gehe davon aus, dass in jedem Fall du die Fehlerursache bist und durch unleserlichen+unstrukturierten Code dir selbst die Sache schwer machst.
Gebe direkt nach dem 1. Mal realloc eine Debugausgabeprintf("%d",Grid[i].PosCoord)
aus und dann immer weiter bis zum core-dump, da du ja offensichtlich keinen Debugger benutzen willst/kannst.
calloc initialisiert übrigens mit 0, realloc aber nicht, das solltest du wissen.Das das Problem IMMER vor dem Rechner sitzt weiss ich
Ich war nur der Meinung, dass ich realloc falsch anwende (weil ich das zum ersten Mal mache) und es dadurch zum crash kommt und ich mir den debugger sparen könnte.
Ob der Code unleserlich/unstruktriert ist, ist immer auch Ansichtssache, es hat sich so entwickelt und ich komme gut damit klar. Wenn ich den Quellcode von anderen sehe spring ich auch manchmal in den Schrank... aber seis drum!
Dann werde ich mal schauen wo ich den Zeiger verbiege...
Ciao
OkkaPapa
-
Du kannst dir auch den Adresswert mit %p auch direkt ausgeben lassen:
printf("Grid: %p \n", Grid);
Das ergibt erstmal keine Zugriffsverletzung. Der Wert sollte sich nur nach einem realloc verändern.
-
Wutz schrieb:
dachschaden_off schrieb:
Ich habe bei einem mittelgroßen Projekt den Compiler auf C umgestellt (VS 2010). ... (was ich gut finde, der GCC ist da meines Erachtens zu nachlässig). Aber VS meckert auch, wenn ich den Cast nicht mache.
Quatsch.
Der Fehler liegt nicht bei den Compilern, du bist nicht in der Lage, diese richtig zu bedienen.Ach, Wutz, produzieren wir mal wieder Mist?
Pointer-casts von void* sind NICHT verboten in C, in C++ schon. Ich habe es gerade noch einmal extra geprüft - der Compiler ist für das Projekt auf C-Code eingestellt, die Dateien haben alle die Endung .c. Microsoft ignoriert hier einfach den Standard und versucht hier einen Pointer-cast zu erzwingen, der nicht nur nicht notwendig, sondern auch schädlich ist.Bitte produziere nicht weiter so einen Unsinn, damit diskreditierst du nur dich selbst.
OkkaPapa schrieb:
Danke für das "Aufräumen" des Codes, aber weitergeholfen hat das Aufräumen nicht.
Es ging nicht darum, irgendwelche Bugs zu fixen, auch wenn ich das vielleicht gemacht habe. Es ging darum, dass der Code unleserlich ist und du wahrscheinlich selbst nicht mehr durchblickst, was da eigentlich abgeht. Und das erste, was man da normalerweise macht, ist, den Code einfacher zu gestalten. Danach hast du viel bessere Chancen, da durchzusteigen.
OkkaPapa schrieb:
Das mit dem temporärem Zeiger verstehe ich nicht: wenn realloc fehlschlägt, dann muss ich das Programm sowieso abbrechen.
Warum dann einen temporären zeiger für realloc, der dann, wenn er != NULL ist zurückkopiert wird?Weil es Systeme gibt, bei denen Speicher NICHT automatisch nach Prozessende freigegeben wird. Keine Ahnung, WO dein Programm zum Einsatz kommen wird. Aber als Faustregel gilt immer: räume hinter dir auf. Lasse keine Adresse, die von malloc oder calloc zurückgegeben wird, ungefreed. Das wird dir vor allem dann, wenn später jemand um die Ecke kommt und sagt: "Lass das Programm in Fehlerfall X und Y und Z machen" den Hals retten - vor allem dann, wenn X und Y und Z eine Menge Speicher brauchen. Und es wird die Leute, die dann später deinen Code warten, solltest du irgendwann nicht mehr daran arbeiten, nicht ungläubig nach einem free suchen lassen. Code verrottet nicht, der ist nicht wie ein Tisch, der mit den Jahren morsch wird und zerfällt. Der ist morgen noch genauso frisch, wie du ihn gestern gelassen hast.
OkkaPapa schrieb:
Der Punkt ist, daß realloc in meinem Code (lesbar oder nicht) einen gültigen Zeiger zurückliefert und ich dann später einen core dump bekomme.
Dann gibt es zwei Möglichkeiten, wenn du sicher bist, dass von realloc nichts kaputtes zurückkommt:
1. Du speicherst den Zeiger nicht korrekt ab.
2. Du greifst auf den Zeiger nicht korrekt zu.Deswegen sagte ich, lass dir den Wert der Zeiger (siehe DirkB, printf("%p\n",ptr)) ausgeben. Wenn da was nicht stimmt, musst du herausfinden, wo die Adresse anfängt, keinen Sinn mehr zu ergeben.
OkkaPapa schrieb:
Ach ja: wäre nett von Dir, wenn Du Dich bei Deinen Kommentaren etwas mäßigen würdest.
Mag sein, dass Du der C/C++ Guru bist und ich das Dummerchen, aber wenn ich Deine Meinung Ernst nehmen soll, dann wäre eine gewisse Sachlichkeit angebracht.Ich frage nicht danach, ob du meine Meinung ernst nimmst. Von mir aus kannst du die Postings auch blockieren, das ist mir am Ende des Tages egal. Und ich bin einer der wenigen hier, die sich tatsächlich die Mühe machen und Code schlanker machen, damit der OP wieder versteht, was er da eigentlich macht. Wenn dir die Art dabei nicht gefällt, kannst du mich auch einfach ausblenden.
PS: ein C++-Guru bin ich noch lange nicht. In C bin ich mäßig kompetent.
-
dachschaden_off schrieb:
In C bin ich mäßig kompetent.
Wohlwollend formuliert.
Du hast keine Ahnung von nichts also halte die Klappe und verbreite nicht jedesmal so einen Unsinn bei deinen Antworten, dein aufgeschnapptes Halbwissen interessiert niemanden und irritiert den Fragesteller.
-
Wutz schrieb:
dachschaden_off schrieb:
In C bin ich mäßig kompetent.
Wohlwollend formuliert.
Du hast keine Ahnung von nichts also halte die Klappe und verbreite nicht jedesmal so einen Unsinn bei deinen Antworten, dein aufgeschnapptes Halbwissen interessiert niemanden und irritiert den Fragesteller.Find ich klasse, dass du hier ad hominem kommst, anstatt mal auf das Argument einzugehen. Wer weiß, vielleicht könnte ich sogar was lernen. Aber nein, stattdessen hältst du nicht mal das für notwendig. Und dann erwartest du, dass ich dich ernst nehme.
Und wenn ich mich daran zurückerinnere, wie du mal meintest, dass
char*
undint*
ja das gleiche seien (und wie ich diese These widerlegt habe, indem ich willentlich meinen Stack zerstört habe) - und wie du nie darauf reagiert hast, dann würde ich pauschal mal annehmen, dass ich locker mehr über Zeiger weiß als du. Ja, klar, Halbwissen - aber bei dir. Aber sowas von Kanone.Und wie DU mit deiner zur Schau gestellten Sozialkompetenz irgendwas reißen kannst, entzieht sich meinem Verständnis.
-
Du bist inkompetent hier irgendwelche Problemlösungen beizusteuern.
Deine falschen inkompetenten "Beiträge" sind nicht nur überflüssig sondern verhindern eine schnelle kompetente Problemlösung.
Du hast nachweislich keine Ahnung also trolle dich dahin wo du hergekommen bist.
-
Ist das eigentlich euer ernst, oder habt ihr euch in Wirklichkeit ganz doll lieb?
-
Hallo dachschaden_off,
Du Schreibst, dass es Dir egal ist, ob ich Deine Meinung ernst nehme...
Da du aber Dich explizit noch mal dazu geäußert hat, dass ich Dein erstes posting nicht beantwortet habe und nach Deinen anderen Reaktionen in diesem thread glaube ich das nicht so recht...Evt. solltest Du Dir selbst erstmal klarmachen was Deine Absicht (hier in diesem Forum) ist?
Willst Du anderen helfen Ihre Fragen rund um C zu beantworten und ihnen helfen?
Dann sind postings, die mit "Heilige Scheiße, das kann man sich ja nicht reinziehen ..." beginnen, nicht hilfreich.
Ebenso die respektlosen Kommentare und die GROSSBUCHSTABEN! Das ist, als ob mich jemand anschreit.
Das kannst Du Dir nur in der Anonymität des Netzes erlauben, aber in der realen Welt hätte ich Dich nach einer Entgleisung dieser Art mal unter vier Augen an die Seite genommen und Dich gefragt wo Dein Problem liegt.
Unter vier Augen geht hier nicht, daher habe ich Dich per posting daran erinnert, dass ich gewisse Umgangsformen vermisse.Oder willst Du den Experten raushängen lassen?
Dann mach es wie alle anderen "Experten" und lass ein paar kryptische Zeilen gefolgt von einen RTFM ab wende Dich dann dem nächsten "Opfer" zu und sonne Dich in Deinem Expertentum.Die Menschen suchen hier entweder Rat und Unterstützung (wie ich Ahnungsloser und damit habe ich mich geoutet, was _ich_ hier will) oder Sie stellen ihre Zeit und ihre Kenntnisse den "Ahnungslosen" zur Verfügung, weil es Ihnen ein gutes Gefühl gibt und sie helfen und unterstützen wollen. Zumindest ich für meinen Teil finde das klasse und muss dafür hier mal ein paar virtuelle Schulterklopfer loslassen!
Aber:
Weder geben die Ratsuchenden ihre Würde mit dem klicken des "Absenden"-Knopfes ab, noch berechtigt ein "dummes" posting die Experten den Fragenden mit ihren subjektiven Kommentaren herabzuwürdigen.Jeder ist irgendwo, irgendwann bei irgendeinem Thema mal in der einen oder anderen Gruppe und möchte weder ob seiner Ahnungslosigkeit angemacht und ausgelacht noch ungedankt und mit einem Arschtritt ausgequetscht und abgeschröpft werden.
Daher Danke an alle fürs lesen und für die Antworten zum realloc.
Ciao
OkkaPapa
P.S. Das wars für mich zu diesem offtopic, wer weiter diskutieren will, gerne per PM aber ich bin ab heute im Urlaub, Antworten daher erst wenn ich wieder da bin.
Ciao
OkkaPapa