.
|
|
| Autor | Beitrag |
|---|---|
|
000 07.03.2007, 19:26 Cpt. Rick |
Hi, ich habe ein seltsames Problem mit einem C Programm.
Ich bin mit meinem Latein am Ende, ich sehe weder einen logischen Fehler, noch bekomme ich einen Error im Compiler! -- |
|
Profil || Suche |
|
001 07.03.2007, 19:56 feigling |
Was soll denn das da sein: scanf("%s", &ini[40]); Benutze scanf("%s", ini); bzw am Besten fgets(ini, 40, stdin); Edit: Und bist du sicher, es soll
sein und nicht
Dieser Beitrag wurde am 07.03.2007 um 20:00 von feigling bearbeitet. |
|
Profil || Suche |
|
002 07.03.2007, 20:06 Cpt. Rick |
fgets(ini, 40, stdin); funktioniert ganricht, da bricht er das Programm schon bei der Eingabe des Namens der ini ab! scanf("%s", ini); Das Programm bricht an der Stelle *1 ab! EDIT: #inculde "start_svr.h" ändert auch nichts am Abbruch. Dieser Beitrag wurde am 07.03.2007 um 20:10 von Cpt. Rick bearbeitet. |
|
Profil || Suche |
|
003 07.03.2007, 20:22 feigling |
Was heißt, fgets(ini, 40, stdin); funktioniert garnicht ... Natürlich funktioniert das.
und das funktioniert sogar besser als scanf, da scanf bei Leerzeichen abbricht, wenn man das nicht im fomat String von scanf anders behandelt. Das einzige, was du bei fgets noch machen musst, ist das newline Zeichen am Ende zu löschen. sprintf(ini_path,"%s\\%s", dir, ini); bringt dir auch genau 0, weil dir undefniert ist, da du dir nirgendwo einen Wert zuweist. --Dieser Beitrag wurde am 07.03.2007 um 20:22 von feigling bearbeitet. |
|
Profil || Suche |
|
004 07.03.2007, 20:44 Cpt. Rick |
Hmm...also das Programm läuft trotz dieser Fehler bis zu der Stelle der Eingabe VOR dem switch!!! Das auslesen der ini ist kein Problem. In einem Test habe ich mir die Werte zurückgeben lassen, das Programm bricht erst an der Stelle die im Code mit // *1 markiert ist ab! Edit: Hier: getcwd(dir, 240); erhällt dir seinen Wert! --Dieser Beitrag wurde am 07.03.2007 um 20:56 von Cpt. Rick bearbeitet. |
|
Profil || Suche |
|
005 07.03.2007, 21:23 Cpt. Rick |
http://treky21.tr.funpic.de/server.exe Das ist das kompilierte Programm. Dieser Beitrag wurde am 07.03.2007 um 21:23 von Cpt. Rick bearbeitet. |
|
Profil || Suche |
|
006 07.03.2007, 23:00 HammerBlade |
Hast du mal dazu einen Debugger deiner Wahl befragt, z.B. GDB? --"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon |
|
Profil || Suche |
|
007 07.03.2007, 23:41 feigling |
Ah, das getcwd(dir, 240); hab ich ned gesehen. Dann scheint es irgendwo wohl nen Bufferüberlauf zu geben oder so, von daher siehe Post von HammerBlade. -- |
|
Profil || Suche |
|
008 11.03.2007, 12:42 Cpt. Rick |
GDB ist leider Linux, da ich aber auf Win programmiere nützt mir das also nicht viel. Ich bekomme nun beim Kompilieren folgenden error:
An Access Violation (Segmentation Fault) raised in your program. Nach dem der Error Nachricht zeigt der Marker auch auf Zeile 65. Dieser Beitrag wurde am 11.03.2007 um 12:44 von Cpt. Rick bearbeitet. |
|
Profil || Suche |
|
009 11.03.2007, 13:49 HammerBlade |
Welchen Compiler/IDE verwendest du denn sonst? GDB gibts sehr wohl für Windows ( http://mesh.dl.sourceforge.net/sourceforge/mingw/gdb-6.3-2.exe ) und du hast ihn vielleicht sogar benutzt, wenn du DevC++ mit MinGW benutzt hast. Dein Problem ist etwas komisch, weil der GCC sich erst mit dem -g Flag (Symbols-Flag) darüber auslässt. Das Problem findet man auch bei goto's und das switch ist eine Art verkapptes goto.
Daher musst du dafür sorgen, dass die Variablen aus case-1 auch nur in case-1 gültig sind. Du musst also ihr Scope verkleinern, indem du die oben angezeigen Klammern setzt. Edit:
So wäre es "richtiger/normaler":
"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon Dieser Beitrag wurde am 11.03.2007 um 14:52 von HammerBlade bearbeitet. |
|
Profil || Suche |
|
010 11.03.2007, 17:48 theDon |
Variable-Length-Arrays sind Teil von C99, das ist keine GCC-Extension. --\o tanz den naziprau! o/ And more than ever, I hope to never fall, |
|
Profil || Suche |
|
011 11.03.2007, 18:11 feigling |
Außerdem castet man malloc in c nicht. -- |
|
Profil || Suche |
|
012 11.03.2007, 22:52 Cpt. Rick |
Mit den Klammern ({ & }) funktioniert es wieder einwandfrei! Danke Jungs, ihr sied die Besten! ;) -- |
|
Profil || Suche |
|
013 12.03.2007, 00:13 Master Pegasus |
Man castet malloc nicht? In C++ verwendet man doch new und delete und zumindest mir wurde an der Uni im C-Praktikum schon beigebracht malloc zu casten. --Was immer auch geschieht: Nie sollt Ihr so tief sinken, von dem Kakao, durch den man Euch zieht, auch noch zu trinken! -- Erich Kästner |
|
Profil || Suche |
|
014 12.03.2007, 02:05 HammerBlade |
Okay VisualC war ein hinkender Vergleichs-Compiler, bei dem ich im Nachhinein nicht mal herausgefunden habe, ob oder wie man da verschiedene Standards ala -std=c99/... vorgeben kann. Ich muss zu meiner Verteidigung sagen, dass ich mich nie wirklich speziell mit C alleine beschäftigt habe. Ich verwende im Allgemeinen C++. Man castet anscheinent malloc in C deswegen nicht, weil man es nicht muss, in C++ muss man es sehr wohl casten, daher war mir nicht bewusst, dass man es in C nicht braucht. Man lernt nie aus. --"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon Dieser Beitrag wurde am 12.03.2007 um 02:08 von HammerBlade bearbeitet. |
|
Profil || Suche |
|
015 12.03.2007, 16:28 TheTinySteini |
In C++ benutzt man ja auch kein malloc... --TheTinySteini |
|
Profil || Suche |
|
016 12.03.2007, 17:48 Kriz |
-- K:R-I)Z++ |
|
Profil || Suche |
|
017 12.03.2007, 18:22 feigling |
Man castet malloc() in C nicht, weil es folgenden Grund hat: Vergisst man mal stdlib.h zu includen, denkt sich der Compiler, dass malloc int zurückgibt, was natürlich falsch ist, da diese Funktion nen void Pointer zurückgibt. Castet man nun, denkt sich der Compiler .. "ok, da der Programmierer castet, scheint das alles zu stimmen" und es kommt totaler Müll bei raus. Castet man nicht, bekommt man vom Compiler solch eine Warnung "warning: assignment of pointer from integer lacks a cast" -> man sieht, dass da irgendwas mit malloc nicht stimmt. Daher sollte man in C malloc, realloc, calloc .. nicht casten. --Dieser Beitrag wurde am 12.03.2007 um 18:23 von feigling bearbeitet. |
|
Profil || Suche |
|
018 12.03.2007, 19:35 oxff |
eigtl. ist es egal, ob der Compiler annimt, dass es jetzt einen int zurückgibt anstatt eines void *. Beide Typen sind als `native breite' definiert, also meistens 32bit. Intern ist jeder Pointer ohnehin ein int. Einzig die calling convention könnte hier also einen Strich durch die Rechnung machen; da kommt es dann auf die default Calling-Convention deines Compilers und deiner libc an. --mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik |
|
Profil || Suche |
|
019 12.03.2007, 21:30 hausi |
Das mit der nativen Breite von ints stimmt ja bisher schon, allerdings gibts da jetzt ja leider auch eine Ausnahme: -- Dieser Beitrag wurde am 12.03.2007 um 21:33 von hausi bearbeitet. |
|
Profil || Suche |
|
020 12.03.2007, 21:32 hausi |
Sorry, doppelpost... --Dieser Beitrag wurde am 12.03.2007 um 21:33 von hausi bearbeitet. |
|
Profil || Suche |
|
021 12.03.2007, 23:38 theDon |
Schwachsinn: ``A pointer may be converted to an integral type large enough to hold it; the required size is implementation-dependent.'' --TCPL, A6.6 -- \o tanz den naziprau! o/ And more than ever, I hope to never fall, |
|
Profil || Suche |
|
022 12.03.2007, 23:47 Kriz |
Damit dürften wir jetzt wohl jeden Aspekt durchgekaut haben und kommen zu dem Schluß, der bereits vor Äonen festgestellt worden ist: malloc() wird nicht gecastet, sofern der Compiler gerade auf C ist. --K:R-I)Z++ |
|
Profil || Suche |
|
023 19.03.2007, 17:45 default |
c compiler die älter als ansi sind returnen für malloc char * anstelle von void *, daher musste man da explizit casten, man gewinnt durch den cast also rückwärtskompatibilität von ca 20y. --Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst. |
|
Profil || Suche |
|
024 19.03.2007, 19:24 Kriz |
Hm, ob man da nicht noch mit far und near rumpopeln müsste? --K:R-I)Z++ |
|
Profil || Suche |
|

