• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

C Pointer bzw Array Problem

Captain_Obvious

Neu angemeldet

Registriert
15 Okt. 2013
Beiträge
37
Ort
127.0.0.1
Hi, nachdem ich die letzten Monate hier im wesentlichen nur mitgelesen hab Poste ich mal ein kleines Problem welches mich die letzten 2 Stunden beschäftigt hält.

Folgendes Programm hab ich für eine Übung zusammengebastelt: http://pastebin.com/dz2gMR7G
[src=c]#include <stdio.h>

int isPalindrom(char *text);
char toLower(char *text);
char removeNonLetters(char *text);

int main(int){
char teststring[31];
char *testvalue[] = { "Ha/n/nah", "La-ger-regal", "O%t/to", "(Reit-)tier", "Reliefpfeiler", "Ren--tner", "R!o!t)or", "st--ets", "nein", "Hall67o", "Lastwa$gen" };
char *text;
int x;
text = teststring;
int choice = -1;
do{
printf("---Paldindrom---\nOptionen:\n");
printf("0 = Eigenen String eingeben\n");
printf("1 = Teststring durchkauen und ausspucken\n");
printf("2 = Programm beenden\n");
scanf_s("%d", &choice);
if (choice == 0)
{
printf("Bitte Testwort eingeben: ");
gets_s(teststring,30);
printf("%s\n", *text);
if (isPalindrom(text))
printf("Es handelt sich um ein Palindrom.\n");
else
printf("kein Palindrom\n");
removeNonLetters(text);
printf("Nach RemoveNonLetters %s", *text);
printf("%s\n", *text);
if (isPalindrom(text))
printf("Es handelt sich um ein Palindrom.\n");
else
printf("kein Palindrom\n");
toLower(text);
printf("Nach toLower %s", *text);
printf("%s\n", *text);
if (isPalindrom(text))
printf("Es handelt sich um ein Palindrom.\n");
else
printf("kein Palindrom\n");

}
if (choice == 1)
{
int y;
for (y = 0; y < 11; y++){
text = testvalue[y];
for (x = 0; text[x] != '\0'; x++) {
printf("**********************\n");
printf("%s\n", text);
if (isPalindrom(text) == 1)
printf("Es handelt sich um ein Palindrom.\n");
else
printf("kein Palindrom\n");
removeNonLetters(text);
printf("Nach RemoveNonLetters %s\n", text);
if (isPalindrom(text))
printf("Es handelt sich um ein Palindrom.\n");
else
printf("kein Palindrom\n");
toLower(text);
printf("Nach toLower %s\n", text);
if (isPalindrom(text))
printf("Es handelt sich um ein Palindrom.\n");
else
printf("kein Palindrom\n");
}
}
text = teststring;
}
if (choice == 2)
return 0;
choice = -1;
} while (choice >2 || choice <0);
}

int isPalindrom(char *text){
int x;
int laenge;
int y = 0;
for (laenge = 0; text[laenge] != '\0'; laenge++);

laenge=laenge-1;

for (x = 0; x <= laenge; x++)
{
if (text[x] == text[laenge - x])
y++;
}
if (y == laenge)
return 1;
else
return 0;
}

char toLower(char *text){
int laenge;
int x;
for (laenge = 0; text[laenge] != '\0'; laenge++)

laenge = laenge - 1;
for (x = 0; x <= laenge;x++)
{
if (text[x] > 65 && text[x]<91){
text[x] += 32;
}
}
return 0;
}

char removeNonLetters(char *text){
int laenge;
int z;
for (laenge = 0; text[laenge] != '\0'; laenge++)
{
while (text[laenge] < 65 || (text[laenge]>90 && text[laenge] < 97) || text[laenge]>122)
{
for (z = laenge; text[z] != '\0'; z++)
text[z] = text[z + 1];
laenge = laenge - 1;
}
}
return 0;
}[/src]

Compiliert soweit ohne Fehler allerdings Stürzt es bei beiden Menü Optionen ab. Problem ist offenbar dass sowohl das einlesen eines neuen Werts als auch das Testen mit dem Testarray "testvalue" aus dem vorgesehenen Speicherbereich läuft ;) Ich bin mir Relativ Sicher das mit dem Pointer *text etwas nicht okay ist allerdings wundert mich dass das einlesen eines Testwertes in das Array "teststring" laut Visual Studio 2013 schon abstürzt.

Für Hilfe bin ich aktuell echt dankbar ich komm da gerade nicht wirklich weiter :dozey:
 
Zuletzt bearbeitet:

Brother John

(schein)heilig
Veteran

Registriert
1 Aug. 2013
Beiträge
235
Was mir ohne tiefer reinzuschauen sofort auffällt, sind die
Code:
'/0'
Spezialzeichen werden aber mit dem Backslash maskiert, d.h. richtig wäre:
Code:
'\0'
Aktuell vergleichst du anstatt auf ein Byte mit dem Wert Null auf die Zeichenkette »Slash, Buchstabe Null«. … oder besser gesagt auf Pointer dahin … es ist ja C.

Btw.: Kannst du bitte dein Posting editieren und den Quellcode nochmal in [ code]-Tags (ohne das Leerzeichen nach dem [) einfügen? Dann bleiben die Enrückungen erhalten und es ist viel besser lesbar.
 

Captain_Obvious

Neu angemeldet

Registriert
15 Okt. 2013
Beiträge
37
Ort
127.0.0.1
  • Thread Starter Thread Starter
  • #3
okay Code Tags sind drin. Das \0 ist schon mal ein Fehler im Skript hier da steht das tatsächlich in beiden Schreibweisen drin an unterschiedlichen stellen und ich hab wohl die falsche genommen und dachte dann wird schon richtig sein kompiliert ja :P hätte ich besser vorher googlen sollen.


edit: So ich glaube einen Fehler hab ich so Schon mal weg funktioniert trotzdem noch nicht :)
 
Zuletzt bearbeitet:

MingsPing

NGBler

Registriert
15 Juli 2013
Beiträge
347
Leider kennt mein Computer die Funktionen gets_s und scanf_s nicht. Deshalb macht es nicht so viel Sinn, dir da zu helfen.
Jedoch habe ich mir deine anderen Funktionen angeschaut. Die Überprüfung auf Palindrom ist nicht ganz richtig. Und die RemoveNonLetters ist falsch (hier wird z.B. "ha/llo" zu "halllo").

Mein Tipp:
Bring das Programm erstmal ohne so ein interaktives Menü zum Laufen, einfach nur, um deine Funktionalität zu prüfen. Wenn das klappt, kannst du dich um die Zusätze kümmern.
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
btw. allgemein sieht man es als sinnvoll an einerseits ein minimalbeispiel anzubieten welches den Fehler reproduziert und die Fehlermeldung mit anzugeben. Das erhöht die Zahl der Menschen die sich das angucken.
Wenn ich da z.B. sehe: 100 Zeilen Code, "irgendwas" geht "irgendwo" nicht, habe ich wenig lust mich mit einem fremden Programm zu beschäftigen um dann am Ende womöglich einen typo oder sonstwas zu entdecken.
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
bei so einer Lösung reservierst du zb 100 mal den Speicherplatz des längsten Wortes, das in deinem array vorkommt.

[src=c] char testvalue[11][31] = { "Ha/n/nah", "La-ger-regal", "O%t/to", "(Reit-)tier", "Reliefpfeiler", "Ren--tner", "R!o!t)or", "st--ets", "nein", "Hall67o", "Lastwa$gen" };
[/src]

daher solltest du auf folgendes wechseln:

[src=c] char *testvalue[] = { "Ha/n/nah", "La-ger-regal", "O%t/to", "(Reit-)tier", "Reliefpfeiler", "Ren--tner", "R!o!t)or", "st--ets", "nein", "Hall67o", "Lastwa$gen" };
[/src]

so verbrauchst du nicht mehr Platz als nötig.


funktioniert das?
[src=c] text = teststring;
[/src]
 

Captain_Obvious

Neu angemeldet

Registriert
15 Okt. 2013
Beiträge
37
Ort
127.0.0.1
  • Thread Starter Thread Starter
  • #7
gets_s und scanf_s sind nur die Secure versionen und funktionieren im Prinzip wie scanf und gets. Das Problem ist das ich bei beiden Optionen also 0 und 1 nen mem overflow bekomme und selbst nicht genau weiß an welcher stelle das debug window von Visual Studio ist da auch nicht so wirklich richtig hilfreich. Die erste Ausgabe der jeweiligen Auswahl Funktioniert in beiden Fällen und dann ist ende.

@evillive ja die Version ist eleganter muss ich mal umbauen ;) und ja text=teststring; funktioniert und setzt den Pointer Text auf die adresse des ersten Elements von Teststring.

Strings as pointers:
Another way of accessing a contiguous chunk of memory, instead of with an array, is with a pointer.

Since we are talking about strings, which are made up of characters, we'll be using pointers to characters, or rather, char *'s.

However, pointers only hold an address, they cannot hold all the characters in a character array. This means that when we use a char * to keep track of a string, the character array containing the string must already exist (having been either statically- or dynamically-allocated).

Below is how you might use a character pointer to keep track of a string.

char label[] = "Single";
char label2[10] = "Married";
char *labelPtr;

labelPtr = label;
We would have something like the following in memory (e.g., supposing that the array label started at memory address 2000, etc.):

label @2000
------------------------------
| S | i | n | g | l | e | \0 |
------------------------------

label2 @3000
------------------------------------------
| M | a | r | r | i | e | d | \0 | | |
------------------------------------------

labelPtr @4000
--------
| 2000 |
--------
https://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/
 

Brother John

(schein)heilig
Veteran

Registriert
1 Aug. 2013
Beiträge
235
Du hast jedenfalls noch Längen-/Indexfehler drin. Ein nullterminiertes »Hallo« sieht ja so aus:
Code:
Zeichen: H a l l o \0
Index:   0 1 2 3 4 5
Länge: 5+1
Jetzt schau dir z.B. die Längenermittlung in isPalindrom() an. Stimmt das, was am Ende in »laenge« steht? Stimmt dann direkt darunter die Überprüfung der Zeichen vorne/hinten – also prüfst du *wirklich* die genau gegenüber liegenden Zeichen? Wenn du dir die komplette Schleife mit einem kurzen Wort im Kopf (oder Debugger) durchspielst, kommst du sicher auf den Fehler.

Das Problem ist das ich bei beiden Optionen also 0 und 1 nen mem overflow bekomme und selbst nicht genau weiß an welcher stelle das debug window von Visual Studio ist da auch nicht so wirklich richtig hilfreich.
Ich würde vor den kritischen Schleifen Breakpoints setzen und dann Anweisung für Anweisung einzeln durchsteppen. Der Code ist simpel genug, dass du dann recht schnell und exakt mitkriegst, bei welcher Anweisung und welchen Variablenwerten es pufft. Wichtig ist, dass du Debug ohne Optimierungen compilierst. Ich kenne aber Visual Studio nur sehr am Rande und weiß nicht auswendig, wo man das einstellt. Wenn du beim Durchsteppen scheinbar sinnlos hin- und her springst, das ist ein ziemlich sicheres Zeichen für aktive Optimierungen.
 

Captain_Obvious

Neu angemeldet

Registriert
15 Okt. 2013
Beiträge
37
Ort
127.0.0.1
  • Thread Starter Thread Starter
  • #9
Okay ich werde mal versuchen das soweit umzusetzen und bastel mal bis heute Abend eine neue Version davon mit dem Debugger in Visual Studio hab ich leider bisher wenig Erfahrung da kenne ich den für Freescale Assembler weit besser :P
 

Captain_Obvious

Neu angemeldet

Registriert
15 Okt. 2013
Beiträge
37
Ort
127.0.0.1
  • Thread Starter Thread Starter
  • #10
So ich hab das Ganze mal ordentlich überarbeitet und es Funktioniert jetzt und macht was es soll. Das ganze ist wahrscheinlich nicht die eleganteste Lösung wird für die zwecke aber reichen. Danke für die Hilfe dabei ;)

Hier der vorerst Fertige Quellcode:

[src=c]
#include <stdio.h>

int isPalindrom(char *text);
char toLower(char *text);
char removeNonLetters(char *text);
int Ausgabe(char teststring[31]);

int main(int){
char teststring[31];
char testvalue[][31] = { "Ha/n/nah", "La-ger-regal", "O%t/to", "(Reit-)tier", "Reliefpfeiler", "Ren--tner", "R!o!t)or", "st--ets", "nein", "Hall67o", "Lastwa$gen" };

int choice = -1;
do{
printf("---Paldindrom---\nOptionen:\n");
printf("0 = Eigenen String eingeben\n");
printf("1 = Teststring Ausgeben\n");
printf("2 = Programm beenden\n");
printf("Ihre Auswahl: ");
scanf_s("%d", &choice);
if (choice == 0)
{
printf("Bitte Testwort eingeben: ");
fflush(stdin);
gets_s(teststring, 30);
Ausgabe(teststring);
}
if (choice == 1)
{
int x;
for (x = 0; x < 11; x++){
printf("****************\n");
Ausgabe(testvalue[x]);
}
}

fflush(stdin);
choice = -1;
} while (choice >2 || choice <0);
}

int isPalindrom(char *text){
int x;
int laenge;
int y = 0;
for (laenge = 0; text[laenge] != '\0'; laenge++);

laenge = laenge - 1;

for (x = 0; x < laenge; x++)
{
if (text[x] == text[laenge - x])
y++;
}
if (y == laenge)
return 1;
else
return 0;
}

char toLower(char *text){
int laenge;
int x;
for (laenge = 0; text[laenge] != '\0'; laenge++)

for (x = 0; x <= laenge; x++)
{
if (text[x] > 65 && text[x]<91){
text[x] += 32;
}
}
return 0;
}

char removeNonLetters(char *text){
int laenge;
int z, x;
for (laenge = 0; text[laenge] != '\0'; laenge++)
for (x = 0; x < laenge; x++)
{
while (text[x] < 65 || (text[x]>90 && text[x] < 97) || text[x]>122)
{
for (z = x; text[z] != '\0'; z++)
text[z] = text[z + 1];

}
}
return 0;
}


int Ausgabe(char teststring[31]){
printf("Ihr Testtext: %s\n", teststring);
if (isPalindrom(teststring))
printf("Es handelt sich um ein Palindrom.\n");
else
printf("kein Palindrom\n");
char *text;
text = teststring;
removeNonLetters(text);
printf("Nach RemoveNonLetters: %s\n", teststring);
if (isPalindrom(teststring))
printf("Es handelt sich um ein Palindrom.\n");
else
printf("kein Palindrom\n");
toLower(text);
printf("Nach toLower: %s\n", teststring);
if (isPalindrom(teststring))
printf("Es handelt sich um ein Palindrom.\n");
else
printf("kein Palindrom\n");
return 0;
}
[/src]
 
Oben