Wo ist der Fehler ?
-
Der Satz "Zeilen der Datei ohne Kommentare" ist zu groß für Placeholder.
Zu if(i!=0) fehlt imho ein else.
Vor breake; würde vielleicht --nCount passen.
Und Du berücksichtigst nicht die Leerzeichen(Tabs), die for /* und nach */ stehen können.MfG Lem
-
Stimmt, du hast Recht
Ich sitz jetzt seit insgesamt 3 Arbeitstagen daran, die Funktion sieht mittlerweile wieder ganz anders und grösser aus und funzt leider immer noch nicht. Das noch bestehende Problem: eingerückte Leerzeilen werden als Kommentare erkannt.
Ich hab die Funktion erstmal komplett beiseite gelegt und mich mit was anderem beschäftigt, aber wenn ich mich wieder dran setze und sie läuft werde ich sie hier mal posten, da ihr euch ja immerhin auch den Kopf drüber zerbrochen habt, ok?
-
So, die Funktion läuft jetzt bei mir, aber ich bin mir 100%ig sicher, dass sie auch viel, viel kürzer zusammenzufassen ist.
Ich poste sie jetzt hier mal, wenn jemand von euch sie aber zusammenkürzen will, fühlt euch frei das zu tunvoid IgnoreComments(Handle hSource, Handle hCollect) { short nCount = 1; int i, j = 1; char Placeholder[25] = " "; if (GetHandleSize(hSource) != 0) for (i = 0; i < GetHandleSize(hSource); i++) { /* Kommentar erste Zeile */ if (i == 0 && (*(*hSource + i) == '/')) { if ((*(*hSource + (i+1)) == '/') || (*(*hSource + (i+1)) == '*')) { while (!(((*(*hSource + (i+2)) == '*') && (*(*hSource + (i+3)) == '/') && (*(*hSource + (i+4)) == '\r')) || (*(*hSource + (i+2)) == '\r'))) { i++; if (((*(*hSource + (i+2)) == '*') && (*(*hSource + (i+3)) == '/') && (*(*hSource + (i+4)) == '\r')) || (*(*hSource + (i+2)) == '\r')) ; } if (*(*hSource + (i+2)) == '\r') i = i+2; else if (*(*hSource + (i+4)) == '\r') i = i+4; } } /* genereller Kommentar am Anfang einer Zeile */ else if ((*(*hSource + i) == '/') && ((*(*hSource + (i+1)) == '*') || (*(*hSource + (i+1)) == '/'))) { if (*(*hSource + (i-1)) == '\r') { while (!(((*(*hSource + (i+2)) == '*') && (*(*hSource + (i+3)) == '/') && (*(*hSource + (i+4)) == '\r')) || (*(*hSource + (i+2)) == '\r'))) { i++; if (((*(*hSource + (i+2)) == '*') && (*(*hSource + (i+3)) == '/') && (*(*hSource + (i+4)) == '\r')) || (*(*hSource + (i+2)) == '\r')) ; } if (*(*hSource + (i+2)) == '\r') i = i+2; else if (*(*hSource + (i+4)) == '\r') i = i+4; } } /* eingerückter Kommentar */ else if ((*(*hSource + i) == '\t') || (*(*hSource + i) == ' ')) { if (*(*hSource + (i-1)) == '\r') { for (j = i; (*(*hSource + j) != '\r'); j++) { // eingerückte Leerzeile if (*(*hSource + (j+1)) == '\r') i = j; // Kommentar nach Anweisung if (isalnum(*(*hSource + j)) || (*(*hSource + j) == '}')) { while (*(*hSource + (j+1)) != '\r') j++; if (*(*hSource + (j+1)) == '\r') i = j; } // eingerückter "richtiger" Kommentar if ((*(*hSource + j) == '/') && ((*(*hSource + (j+1)) == '/') || (*(*hSource + (j+1)) == '*'))) { while (!(((*(*hSource + (j+2)) == '*') && (*(*hSource + (j+3)) == '/') && (*(*hSource + (j+4)) == '\r')) || (*(*hSource + (j+2)) == '\r'))) { j++; if (((*(*hSource + (j+2)) == '*') && (*(*hSource + (j+3)) == '/') && (*(*hSource + (j+4)) == '\r')) || (*(*hSource + (j+2)) == '\r')) ; } if (*(*hSource + (j+2)) == '\r') { j = j+2; i = j; } else if (*(*hSource + (j+4)) == '\r') { j = j+4; i = j; } j = j-1; } } } } /* generelles Zeilenzählen */ else if (*(*hSource + i) == '\r') nCount++; } sprintf(Placeholder, "Zeilen der Datei ohne Kommentare: %d\n", nCount); HUnlock(hCollect); i = (strlen(Placeholder)+1); BlockMove(&Placeholder, *hCollect, i); HLock(hCollect); }
-
Und was ist mit Tee?
#if 0
jetzt staunst Du aber
#endifchar xxx[]="und das\
//gibt Dir den Rest\
";[ Dieser Beitrag wurde am 09.11.2002 um 18:27 Uhr von Bitsy editiert. ]
-
Original erstellt von Bitsy:
**
#if 0
jetzt staunst Du aber
#endif
**Das ist fies. Dann muss er ja fast einen eigenen Präprozessor nachprogrammieren für
#if 34 < 23 jetzt staunst Du aber #endif
Ich würde sowas als 3 Zeilen Code ansehen, wenn ich so ein Programm bauen müsste. Oder willst Du nur den Fall '#if 0' ausnehmen.
-
Ich habe solch einen Präprozessor sogar derzeit in Arbeit, deshalb kenne ich den Fall gut. Solch ein Block findet sich tatsächlich in der Q2-Source.
Der Nutzen eines solchen Präprozessors liegt auf der Hand:
Replace in Files von Symbolen (also nicht in Strings oder Comments),
Aufsuchen von bestimmten Situationen,
Sourceformatierung, etc.
Programmzeilenzählen ohne Comments pur wäre als Nebenfunktion möglich.Gleichwohl muss ich sagen, dass jener 'Structurizer' auch nur eine Teilmenge aller denkbaren Projekte behandeln kann. Man denke an 'offene' Macros, oder gar includes, stringize-Token, oder ##. Also doch eher ein 'private only'-Projekt.
[ Dieser Beitrag wurde am 09.11.2002 um 21:06 Uhr von Bitsy editiert. ]
-
Original erstellt von Bitsy:
**Und was ist mit Tee?#if 0
jetzt staunst Du aber
#endifchar xxx[]="und das\
//gibt Dir den Rest\
";[ Dieser Beitrag wurde am 09.11.2002 um 18:27 Uhr von [qb]Bitsy** editiert. ][/QB]
Äh... Wie jetzt... Tee ?!?
Ausserdem soll die Funktion sämtliche Quelltextzeilen zählen AUSSER Kommentarzeilen.
Deine if und endif-Bedingung da oben ist kein Kommentar, wird also als 3 Zeilen mitgezählt. Und die Sache darunter enthält in der zweiten Zeile einen Kommentar, sonst doch nicht, und wird somit als 2 Zeilen gezählt, was doch richtig ist.
Oder was willst du mir sagen?Mit euren nachfolgenden Texten zum Präprozessor bin ich als C-Anfänger momentan überfordert...
-
Original erstellt von <Casi666>:
Deine if und endif-Bedingung da oben ist kein Kommentar, wird also als 3 Zeilen mitgezählt.ja, aber es wird NIE ausgefuehrt, insofern könnte man es für kommentare nutze...
Und die Sache darunter enthält in der zweiten Zeile einen Kommentar,
nein!
char xxx[]="und das\
//gibt Dir den Rest\
";
ist gleich
char xxx[]="und das//gibt Dir den Rest";
-
und wenn man das in nem anständigen Editor schreibt sieht man sogar das das in der zeiten Zeile kein Kommentar ist...
-
@Casi:
Jetzt mach Dir über diese Spezialfälle mal keine Gedanken, die dürften in der Praxis kaum vorkommen. Trotzdem sind sie zumindest denkbar, und mit ein wenig Böswilligkeit könnten Dich andere mit sowas ärgern. Bringst Du die Fälle irgendwie mit unter, bist Du derjenige, der zuletzt lacht.Und:
Wenn Du nicht werbegeschädigt bist, hat es keinen Sinn die Sache mit dem Tee zu erklären.
-
Okay, keine Gedanken machen kann ich besonders gut
Die Sache mit den #if-Sachen stimmt natürlich, aber dafür gibt es ja Konventionen laut ANSI an die man sich halten sollte betreffs Kommentare
Und die zweite Sache wusste ich so nicht. Hast natürlich Recht, es wird als Kommentar erkannt, da ich das Ding ja so programmiert habe und nicht wusste, dass sowas wie in deinem Beispiel geht *arghz*
Anway: Danke, okay und Gute Nacht *grinsel*
-
Original erstellt von Shade Of Mine:
ja, aber es wird NIE ausgefuehrt, insofern könnte man es für kommentare nutze...Es verhält sich aber schon ein wenig anders:
/* 'bla */ /* darf */ #if 0 'bla /* darf nicht */ #endif
Also ist es kein vollwertiger Ersatz für richtige Kommentare.
-
Original erstellt von Daniel E.:
*```cpp
#if 0
'bla / darf nicht */
#endifNicht? Beim VC++ gehts ... Jaja, ich hör euch schon wieder schreien, aber wieso sollte es nicht gehen?
-
Der Text zwischen #if und #endif muss für den Präprozessor verständlich sein. Hier ist es das nicht, weil ein Literal (eingeleitet durch ') nicht abgeschloßen wurde.
btw: Wenn der MSVC das so durchgehen lässt, was macht er dann bei "?