WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 18.10.2003, 21:00   #1
K@sperl
bitte Mailadresse prüfen!
 
Registriert seit: 03.04.2001
Beiträge: 2.387


Standard C - char* und char[]

Hab da ein kleines C Problem, folgende Problemstellung:
Das Programm soll aus zwei Arrays(consonants, vowels) jeweils einen Buchstaben auslesen, wobei der Buchstabe per Zufallszahl ausgewählt wurde, und diesen Buchstaben dann in einen String str einfügen. Da die Funktion, die das bewerkstelligt, aber vom Datentyp char* ist, und der String, der aus den einzelnen Buchstaben zusammengesetzt ist vom Datentyp char, passt das natürlich nicht. Drum hab ich mir gedacht, daß ich den fertigen String str mit einem impliziten Typecast durch Zuweisung an brand vom Datentyü char* ebenfalls zu char* konvertieren kann und diesen dann an die Funktion NewBrand zurückgebe - geht aber nicht, keine Ahnung warum, da wir noch nicht gelernt haben was char* ist, und ich aufgrund einer Mathe Klausur auch nicht genug Zeit habe mir das alles selbst rauszusuchen. Aja, als Kommandozeilenparameter wird die Länge des Strings mitgegeben, hier im Programm als Var. n


Hier ist mal der Code der entsprechenden Funktion
Code:
char* NewBrand(int n) {
  int cons, vow, i;
  char str[n];
  char* brand;
  i = 0;
  while(i < n) {
    cons = RandNumber(21);
    vow = RandNumber(5);
    str[i] = consonants[cons];
    i = i + 1;
    if(i < n) {
      str[i] = vowels[vow];
      i = i + 1;
    }
  }
  brand = str;
  //printf("%s", str);
  //printf("%d", i);
  return brand;
}
K@sperl ist offline   Mit Zitat antworten
Alt 18.10.2003, 22:32   #2
sagi
Elite
 
Registriert seit: 08.11.2001
Alter: 42
Beiträge: 1.285


Standard

Nachdem du von brand nur die Adresse uebergibst solltest du IMHO den Speicher schon vorher alliziieren.

nach
PHP-Code:
charbrand
machst du ein

PHP-Code:
brand = (char *)malloc(sizeof(char)); 
evtl. poste bitte die Fehlermeldung.

mfg

c.
____________________________________
www.sagmueller.net

Freedom - use it or lose it (Lawrence Lessig)

Im übrigen bin ich der Meinung, dass Microsoft zerschlagen werden muss.
sagi ist offline   Mit Zitat antworten
Alt 19.10.2003, 00:13   #3
sagi
Elite
 
Registriert seit: 08.11.2001
Alter: 42
Beiträge: 1.285


Standard

Sorry. ich hab da was uebersehen. wenn du in brand mehrere Zeichen speicherst musst du das natuerlich beim malloc beruecksichtigen:

PHP-Code:
malloc(2*sizeof(char)) 
alloziiert dir Speicher fuer 2 Chars.

In deinem Fall:

PHP-Code:
brand = (char *)malloc(n*sizeof(char)); 
mfg
c.
____________________________________
www.sagmueller.net

Freedom - use it or lose it (Lawrence Lessig)

Im übrigen bin ich der Meinung, dass Microsoft zerschlagen werden muss.
sagi ist offline   Mit Zitat antworten
Alt 19.10.2003, 22:40   #4
K@sperl
bitte Mailadresse prüfen!
 
Registriert seit: 03.04.2001
Beiträge: 2.387


Standard

Geht leider noch immer nicht.

Wenn ich aber innerhalb der Funktion NewBrand 'brand' ausgebe, wird es korrekt ausgegeben, wenn ich aber 'brand' an main zurückgebe, und dann in main die entsprechende Var. ausgebe, sehe ich nur Sonderzeichen.
K@sperl ist offline   Mit Zitat antworten
Alt 19.10.2003, 22:54   #5
Biri
Hero
 
Registriert seit: 04.09.2001
Beiträge: 894


Standard

Zitat:
Wenn ich aber innerhalb der Funktion NewBrand 'brand' ausgebe, wird es korrekt ausgegeben, wenn ich aber 'brand' an main zurückgebe, und dann in main die entsprechende Var. ausgebe, sehe ich nur Sonderzeichen.
Das liegt daran, dass du einen zeiger auf eine stack-variable zurückgibts. Darf man nicht machen, da dieser anch dem Verlassen der Fu. nicht mehr gültig ist.
Korrekte Vorgangsweise: Speicher am Heap allokieren oder Speicher für string in der main funktion vereinbaren + zeiger auf diesen der Fu. übergeben.

fg
-hannes
Biri ist offline   Mit Zitat antworten
Alt 19.10.2003, 23:06   #6
K@sperl
bitte Mailadresse prüfen!
 
Registriert seit: 03.04.2001
Beiträge: 2.387


Standard

Da ich von Zeigern, zumindest in C, noch keine Ahnung hab, bitte ich dich mir das genauer zu erklären.
K@sperl ist offline   Mit Zitat antworten
Alt 19.10.2003, 23:09   #7
sagi
Elite
 
Registriert seit: 08.11.2001
Alter: 42
Beiträge: 1.285


Standard

Ok. ich habs mir noch mal genauer durchgesehen... ich sollte wirklich gruendlicher schauen

den malloc fuer brand kannst du vergessen, da du ja hier:
PHP-Code:
brand str
nicht die Daten sondern die Adresse uebergibst. Das Problem dabei ist, dass dieser Speicherbereich mit dem Ende der Funktion geloescht wird und daher der Pointer ins nichts geht.

Mir stellt sich allerdings die Frage, ob du nicht einfach auf die Variable "str" verzichten kannst und gleich mit brand arbeiten kannst?

PHP-Code:
charNewBrand(int n) {
  
int consvowi;
  
charbrand;
  
brand = (char *)malloc(sizeof(char)+1);
  
0;
  while(
n) {
    
cons RandNumber(21);
    
vow RandNumber(5);
    
strncat(brand, &consonants[cons], 1);
    
1;
    if(
n) {
      
strncat(brand, &vowels[vow], 1);
      
1;
    }
  }
  return 
brand;

hab das aber nicht getestet. Du musst natuerlich die string.h verwenden.

mfg
c.
____________________________________
www.sagmueller.net

Freedom - use it or lose it (Lawrence Lessig)

Im übrigen bin ich der Meinung, dass Microsoft zerschlagen werden muss.
sagi ist offline   Mit Zitat antworten
Alt 19.10.2003, 23:19   #8
K@sperl
bitte Mailadresse prüfen!
 
Registriert seit: 03.04.2001
Beiträge: 2.387


Standard

@sagi

So in der Art hatte ich es, schon aber ich hab das & bevor ich den char aus dem Array auslese nicht gemacht, kann das vielleicht damit zusammenhängen, daß es nicht funktioniert hat?
Was macht dieses '&' eigentlich?


edit: das '&' zeigt anscheinend auf die Adresse des jeweiligen Elements, stimmt das? Falls ja, würde ja brand immer auf ein anderes Element zeigen, und nicht auf den gesamten String brand?
K@sperl ist offline   Mit Zitat antworten
Alt 19.10.2003, 23:28   #9
sagi
Elite
 
Registriert seit: 08.11.2001
Alter: 42
Beiträge: 1.285


Standard

das & gibt die Adresse an. Wenn du das nicht gemacht hast, dann ist das sicherlich der Grund.

auch wenn in der Funktion die Adressen uebergeben werden, werden die Inhalte kopiert. die Adresse von brand aendert sich daher nicht.

mfg
c.

[edit]
Falls du eine gute Doku dazu brauchst:
http://www.pronix.de/C/standard_C/c_...ung_14_3.shtml
____________________________________
www.sagmueller.net

Freedom - use it or lose it (Lawrence Lessig)

Im übrigen bin ich der Meinung, dass Microsoft zerschlagen werden muss.
sagi ist offline   Mit Zitat antworten
Alt 19.10.2003, 23:31   #10
K@sperl
bitte Mailadresse prüfen!
 
Registriert seit: 03.04.2001
Beiträge: 2.387


Standard

Danke, ich les grad C programming language, absolut spitzen Lektüre
K@sperl ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:10 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag