Die Mathe-Redaktion - 23.11.2017 13:51 - Registrieren/Login
Auswahl
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden oder den Newsletter bestellen.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 747 Gäste und 20 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C: Arrays
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule C: Arrays
Oggel
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 29.12.2015
Mitteilungen: 100
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2017-11-07 13:27


Hi Leute,

wieso kann ich folgendes Beispiel nicht ausführen:
C
#include <stdio.h>
int *times(int vector[], int times){
    int i;
 
    for(i=0; i<sizeof(vector); i++){
        vector[i] *= times;
    }
    return vector;
}
 
 
int main(int argc, char **argv){
 
    int v [4] ={1,1,1,1};
 
    v = times(v, 5);
    printf("(%d,%d,%d,%d)", v[0],v[1],v[2],v[3]);
    return 0;
}

Das liegt ja wahrscheinlich an dieser Zeile:
v = times(v, 5);

Danke schonmal für die Hilfe :-)



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 1725
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2017-11-07 13:30


Die Fehlermeldung könnte informativ sein.

Danach reden wir weiter, dein Programm enthält auch mindestens einen Fehler, den der Compiler nicht findet.


-----------------
⊗ ⊗ ⊗



  Profil  Quote  Link auf diesen Beitrag Link
Oggel
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 29.12.2015
Mitteilungen: 100
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2017-11-07 14:14


Achja Sorry. Hier die Fehlermeldung:

/main.c:16:7: error: assignment to expression with array type
     v = times(v, 5);
       ^

Welchen Fehler meinst du?




  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 1725
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2017-11-07 14:23


2017-11-07 14:14 - Oggel in Beitrag No. 2 schreibt:
Achja Sorry. Hier die Fehlermeldung:

/main.c:16:7: error: assignment to expression with array type
     v = times(v, 5);
       ^
OK, und was sagt uns diese Fehlermeldung? Man kann einem Array nichts zuweisen. Am besten schlägst du nochmal nach, wie das mit der Zuweisung in C funktioniert.


Welchen Fehler meinst du?
Das sizeof(vector) gibt dir die Größe in Bytes, die die Variable vector belegt. Erstens, was hat das mit der Anzahl der Elemente zu tun?

Zweitens: Wenn ein Funktionsparameter einen Arraytyp hat, ist das gleichbedeutend damit, dass er den entsprechenden Zeigertyp hat. Das heißt, im Prinzip steht da sizeof(int*). Was noch weniger mit der Anzahl der Elemente zu tun hat (obwohl die zufällig 4 ist, was ein gängiger Wert für die Größe eines Zeigers ist).
Am besten vermeidet man Arraytypen in Parametern grundsätzlich und schreibt sie direkt als Zeiger.



  Profil  Quote  Link auf diesen Beitrag Link
Oggel
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 29.12.2015
Mitteilungen: 100
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2017-11-07 14:54



OK, und was sagt uns diese Fehlermeldung? Man kann einem Array nichts zuweisen. Am besten schlägst du nochmal nach, wie das mit der Zuweisung in C funktioniert.


Ich habe mich bloß gewundert, da der Arrayname ja auch bloß ein Zeiger auf das erste Element ist und die Funktion ja einen Zeiger zurück gibt. Im Prinzip wird ja einem Zeiger einfach ein Zeiger zugewiesen oder?


Das sizeof(vector) gibt dir die Größe in Bytes, die die Variable vector belegt. Erstens, was hat das mit der Anzahl der Elemente zu tun?

Zweitens: Wenn ein Funktionsparameter einen Arraytyp hat, ist das gleichbedeutend damit, dass er den entsprechenden Zeigertyp hat. Das heißt, im Prinzip steht da sizeof(int*). Was noch weniger mit der Anzahl der Elemente zu tun hat (obwohl die zufällig 4 ist, was ein gängiger Wert für die Größe eines Zeigers ist).
Am besten vermeidet man Arraytypen in Parametern grundsätzlich und schreibt sie direkt als Zeiger.

Stimmt. Dann müsste man irgendwie sowas machen:
C
int *times(int vector[], int times){
    int i;
    for(i=0; i< (sizeof(vector) / sizeof(int)); i++){
        vector[i] *= times;
    }
    return vector;
}
 


Allerdings funktioniert das noch nicht so ganz, da anscheinend die Größe von vector[] nicht bekannt ist. Die Schleife läuft in dem Fall nur einmal. Kannst du mir einen Tipp geben?

Danke dir :)



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 1725
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2017-11-07 15:07


2017-11-07 14:54 - Oggel in Beitrag No. 4 schreibt:
Ich habe mich bloß gewundert, da der Arrayname ja auch bloß ein Zeiger auf das erste Element ist
Ein Array ist ein Array, ein Zeiger ist ein Zeiger. Man sagt ein Array "zerfällt" (decays) bei fast jeder sich bietenden Gelegenheit in einen Zeiger auf das erste Element, aber das heißt nicht, dass es dasselbe ist.

n
 und die Funktion ja einen Zeiger zurück gibt. Im Prinzip wird ja einem Zeiger einfach ein Zeiger zugewiesen oder?
Eine der Gelegenheiten, wo dieser Zerfall nicht stattfindet. Wenn man sich mal überlegt, wie das im Speicher aussehen würde, ist einem das auch klar. Ein Array ist nichts weiter als eine Anordung von Elementen, die im Speicher hintereinander liegen. Es gibt überhaupt keinen Zeiger, dem man etwas zuweisen kann. Man kann allerdings ohne großen Aufwand die Adresse des ersten Elements als Zeiger gewinnen.


Stimmt. Dann müsste man irgendwie sowas machen:
C
int *times(int vector[], int times){
    int i;
    for(i=0; i< (sizeof(vector) / sizeof(int)); i++){
        vector[i] *= times;
    }
    return vector;
}
 

Dein Vorschlag berücksichtigt jetzt nur mein "erstens", aber nicht das "zweitens". So wird das nichts.


Allerdings funktioniert das noch nicht so ganz, da anscheinend die Größe von vector[] nicht bekannt ist.
Doch, die ist bekannt. Ich hab das alles schon geschrieben.


 Die Schleife läuft in dem Fall nur einmal. Kannst du mir einen Tipp geben?
Übergib die Größe des Arrays als weiteren Parameter.



  Profil  Quote  Link auf diesen Beitrag Link
Oggel
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 29.12.2015
Mitteilungen: 100
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2017-11-07 15:22


Okay das ergibt Sinn.

Dass die Größe von Vektor nicht bekannt ist meinte ich folgendermaßen:
C
int main(int argc, char **argv){
 
    int v [5] ={1,1,1,1,1};
    printf("sizeofv: %d\n",sizeof(v));
    int *vector = times(v, 4, sizeof(v) / sizeof(int));
    printf("(%d,%d,%d,%d,%d)", v[0],v[1],v[2],v[3],v[4]);
    return 0;
}

Hier liefert mir sizeof(v) = 20, während mir hier:
C
int *times(int vector[], int times, int n){
    int i;
    printf("sizeofVector: %d\n",sizeof(vector));
    for(i=0; i< (sizeof(vector) / sizeof(int)); i++){
        vector[i] *= times;
    }
    return vector;
}
 
 

sizeof(vector) = 4 liefert.
Aber gut, dann muss man die Anzahl an Elementen der Funktion schon mitgeben.

Danke dir du hast mir sehr geholfen :)



  Profil  Quote  Link auf diesen Beitrag Link
Folgende Antworten hat der Fragesteller vermutlich noch nicht gesehen.
AlphaSigma
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 23.11.2012
Mitteilungen: 120
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2017-11-07 19:59


Hallo Oggel,

in der 2. Zeile verwendest Du den "Bezeichner" times zweimal für
zwei unterschiedliche Dinge.
2017-11-07 13:27 - Oggel im Themenstart schreibt:
Hi Leute,

wieso kann ich folgendes Beispiel nicht ausführen:
C
#include <stdio.h>
int *times(int vector[], int times){
    int i;
...


Das erste times:
C
int *times(int v[], int t)
ist ein Pointer auf eine Funktion mit zwei Argumenten.

Das zweite times:
C
int *func(int vector[], int times)
ist ein Integer (das 2. Argument der Funktion).

Du musst ein times anders benennen.



  Profil  Quote  Link auf diesen Beitrag Link
Oggel wird per Mail über neue Antworten informiert.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2017 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]