Größe eines Arrays als Funktonsparameter

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Größe eines Arrays als Funktonsparameter

    Hallo liebe c Freunde!

    Ich habe schon lange kein C mehr programmiert und ok ich gebe zu ich habe auch noch nicht allzu viel mit c gearbeitet nun ist aber der tag gekommen an dem ich nicht mehr drum rum komme mich vor c zudrücken ;) Und wie erwartet stoße ich gleich mal auf ein Problem ;(

    Also ich möchte ein Programm schreiben das mir Namen von der Console einließt wie viele Namen das sind wird über einen Aufruf parameter festgelegt die namen werden in einem char array gespeichert und in umgekehrter reihne folge wieder ausgegeben : so nun habe ich da auch schon einen ansatz aber es sind noch ein paar unklarheiten :

    1. wie ich einlese von der Console ist klar scanf heißt das stichwort nur wie kann ich das auch so oft aufrufen wie ich es denn brauche also sprich ich muss scanf so oft wie viel namen ich habe eingeben ?

    2. die nächste frage ist wie kann ich meine array größe die mir ja bestimmt wie viele namen ich eingeben darf als parameter beim aufruf bestimmen ? hatte mir dazu das überlegt:

    Quellcode

    1. int main (int argc, char* argv [])
    2. {
    3. char namen [argc];
    4. ...
    5. ...
    6. ...
    7. }

    geht das so ?

    3. auch interessant wäre es die namen in eine verkettete liste zu speichern allerdings habe ich zu der liste keinerlei ansatz kann mir auch da jemand helfen ?

    ja der rest sollte klar sein ausgabe mach ich mit einer umgekehrten vorschleife die einfach rückwärts durch das Array läuft oder habt ihr da eine bessere idee ?
  • 1. Grundlagen schon angeschaut? Schleifen: de.wikibooks.org/wiki/C%2B%2B-…ung_in_C%2B%2B/_Schleifen
    2. argc gibt die die Anzahl der argv Parameter an, sprich die Variable ist wie char *argv[argc] Definiert.
    Wenn du zum Beispiel deinem Programm in irgend einer Form parameter übergibst:

    Quellcode

    1. meinprogram.exe -t 777

    Dann sollte die oben gennanten Variablen den folgenden Inhalte (kann von Betriebsystemabhängig sein) haben:

    Quellcode

    1. argc = 3;
    2. argv[0] = "meinprogram.exe"
    3. argv[1] = "-t"
    4. argv[2] = "777"

    Kannst dir ja Anhand dieser Struktur überlegen wie du deine Anzahl ausliest.
    3. Programmierst du in C oder C++? Wenn du in C++ Programmeirst kannst du schon die fertige Templateklasse Vector als deine Liste benutzen.
    Ansonsten musst du dir deine Liste selbert zussamenstellen. Ich würde hierfür dann einen doppelten char-Pointer verwenden....
    Bei allem wird dir wohl die Standabibliothek eine Hilfe sein: cplusplus.com/reference/

    Mfg Rushh0ur

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rushh0ur ()

  • Danke Rushhour für deine Antwort!
    Natürlich habe ich mir die Grundlagen schonmal angeschaut!
    ich programmierer mit c muss wohl oder über die liste selbst basteln aber dazu später:
    Ich habe das ganz nun fast hinbekommen hier mal mein quellcode:

    Quellcode

    1. # include <stdio.h>
    2. # include <stdlib.h>
    3. int main (int argc, char* argv [])
    4. {
    5. // Index für Forschleife zur initialisierung
    6. int i;
    7. // Index für Forschleife um array zu beschreiben
    8. int d;
    9. // Index für Forschleife zum auslesen des Arrays
    10. //int t;
    11. // Größe des Arrays
    12. int z;
    13. // array für namen
    14. // malloc um speicher der größe z zu reservieren da array dynamisch
    15. char *name = (char *)malloc(z*sizeof(char));
    16. /*Speicherplatzgröße des arrays initalisieren*/
    17. for(i=0; i<argc;i++)
    18. {
    19. z= atoi(argv[i]);
    20. }
    21. //int size=sizeof(name);
    22. /*Schreiben in das Array*/
    23. for(d=0; d<z-1; d++ )
    24. {
    25. printf("Bitte geben Sie den %i Namen ein: \n",d);
    26. //&* da auf zeiger gearbeitet wird
    27. scanf(" %s", &*name);
    28. }
    29. /*Array wieder auslesen*/
    30. /*
    31. for(t=0; t<z-1; t++)
    32. {
    33. char test= name[t];
    34. printf("%s ", test);
    35. }
    36. */
    37. printf("%i", name[5]);
    38. fflush(0);
    39. free(name);
    40. return 0;
    41. }
    Alles anzeigen

    So das ganze funzt auch ganz gut so dachte ich zumindest bis ich den spaß wieder auslesen wollte das problem ist nämlich sobald ich schreibe

    Quellcode

    1. for(t=0; t<z-1; t++)
    2. {
    3. char test= name[t];
    4. printf("%s ", test);
    5. }

    wird mir gesagt warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’

    was ja bedeutet das mir keine buchstaben bzw strings in mein array geschrieben werden sondern zahlen bzw interger werde also habe ich den test gemacht :

    Quellcode

    1. printf("%i", name[5]);

    hier wird mir nun 101 ausgeben

    Was mache ich falsch ? liegt es am malloc? oder am einlesen mit scanf ? habe auch hier eine fehlermeldung bekommen:
    warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char **
    was ich aber durch

    Quellcode

    1. scanf(" %s", &*name);

    behoben habe aber weiß erhlich gesagt nicht ob es korrekt ist hab einfach nur auspropiert da ich mir dachte ich arbeite ja auf einem zeiger zeiger also &*name

    Bitte helft mir !

    Mit freundlichen grüßen
  • So hab mal deinen Quellcode überarbeitet und auskommentiert, pass auf dass du Variablen vor dem benutzen initialisierst.
    Ich meien was für Wert hat den dein Variable z am anfang? Die benutzt du doch um speicher zu reservieren aber die hat noch gar keinen eindeutigen Wert.

    Quellcode

    1. # include <stdio.h>
    2. # include <stdlib.h>
    3. int main (int argc, char* argv [])
    4. {
    5. // Anzahl der einzulessenden Namen
    6. int iNameCount = 0;
    7. // Zaehlvariable
    8. int i;
    9. // Wenn GENAU zwei parameter Übergeben worden sind, den zweiten auslessen und
    10. // in einen int-Wert konventieren (erste ist der Programmpfad)
    11. if (argc == 2)
    12. iNameCount = atoi(argv[1]);
    13. // Wenn die Namensanzahl unguelltig ist oder falsche Parameter
    14. // uebergeben worden sind, Info anzeigen und beenden
    15. if (iNameCount <= 0)
    16. {
    17. printf("usage: myprog.exe <count>\nexample: myprog.exe 2");
    18. return -1;
    19. }
    20. // Speicher für die Pointerliste reservieren (Namensanzahl * Pointertypgröße [<=> void*])
    21. char **cName = (char**)malloc( sizeof(char*) * iNameCount);
    22. // Speicher für die Namenslisteneintraege reservieren
    23. // Maxmimale Zeichenlaenge: 32 Zeichen
    24. for (i=0; i<iNameCount; ++i)
    25. {
    26. cName[i] = (char*)malloc( sizeof(char) * 32);
    27. }
    28. // Namen einlessen
    29. for (i=0; i<iNameCount; ++i)
    30. {
    31. printf("Bitte geben Sie den %i Namen ein:",i+1);
    32. // Keine Referenzierung bei Arrays noetig, da dies schon "unechte" Pointer sind
    33. // i ist in diesem Fall der Listenindex
    34. scanf("%s", cName[i]);
    35. }
    36. // Namen wieder ausgeben
    37. printf("\nEingegebene Namen:\n");
    38. for (i=0; i<iNameCount; ++i)
    39. {
    40. // Wiederum keien Referenzierung noetig
    41. printf("%i: %s\n", i+1, cName[i]);
    42. }
    43. // fflush(0); ??? < wo hast du das her?
    44. // das ist dateioperationen gedacht und wuerde hier nichts bringen
    45. // Aufraumen
    46. for (i=0; i<iNameCount; ++i)
    47. {
    48. // Listeneintraege freigeben
    49. free(cName[i]);
    50. }
    51. // List freigeben
    52. free(cName);
    53. return 0;
    54. }
    Alles anzeigen


    Achja, schau dir nochmal die Rubrik Pointer und Referenzen an und deren Zussamenspiel mit Arrays ;)

    Mfg Rushh0ur