Pointer über 2 Funktioen
-
blubb² schrieb:
probier mal statt
x = &y[0];
das hier:
memcpy(x,y, sizeof(int)*length);
äääh, natürlich
memcpy(x,y, length);
-
Wenn ich folgendes mache:
main() { int a[2] = {3,3}; foo(a, sizeof(a)); ausgabe(a); } foo(int *data, int length) { int I; for(i=0;i<length;i++) { data[i] = i; } }
Dann bekomme ich als Ausgabe 0 und 1. Mein Problem liegt darin dass ich dies nicht nur durch eine sondern durch zwei Funktionen realisieren muss. Ist das denn überhaupt möglich?
-
blubb² schrieb:
blubb² schrieb:
probier mal statt
x = &y[0];
das hier:
memcpy(x,y, sizeof(int)*length);
äääh, natürlich
memcpy(x,y, length);
Das scheint zu funkionieren. Wieviel Overhead bekomme ich denn dazu? Das ganze läuft auf einem Microcontroller...
-
Ja, du musst aber eins beachten:
Wenn du ein Array an eine Funktion übergibst, wird es in einen Pointer auf das erste Element konvertiert. Wenn du diesen Pointer auf etwas anderes zeigen lässt (wie in Beispiel 1), ändert das nichts an das, worauf der Pointer vorher gezeigt hast.
Nur wenn du via arr[n] (was nichts anderes als *(arr + n) ist) ein Element veränderst, wird auf der Wert verändert auf den Pointer zeigt.
Baue einfach die Schleife aus deinem zweiten Beispiel in foo2 ein.
-
PeterXY schrieb:
blubb² schrieb:
blubb² schrieb:
probier mal statt
x = &y[0];
das hier:
memcpy(x,y, sizeof(int)*length);
äääh, natürlich
memcpy(x,y, length);
Das scheint zu funkionieren. Wieviel Overhead bekomme ich denn dazu? Das ganze läuft auf einem Microcontroller...
Vom Prinzip her ist das wie eine for-Schleife, ist aber vermutlich schneller, da direkt ganze Speicherblöcke kopiert werden und nicht nur einzelne Elemente.
-
PeterXY schrieb:
Das scheint zu funkionieren. Wieviel Overhead bekomme ich denn dazu? Das ganze läuft auf einem Microcontroller...
So ungefähr keinen bis hin zu weniger als bei deinem Eigenbau.
Wie kommt es, dass die Leute immer gleich einen Mikrocontroller programmieren, anstatt erst einmal 2-4 Wochen C zu lernen? Pointer, Arrays und Funktionen wirst du andauernd brauchen. Übernimm nicht einfach die fertige Lösung, ohne sie zu verstehen! Schau dir das Thema dringend noch einmal an!
-
Das Problem in deinem ersten Beispiel ist die Zeile 13. Die macht nicht das, was du dir vorstellst.
Hast du dir schon mal length angesehen? Das gibt dir die Größe in Byte an.
Du behandelst es aber wie die Anzahl der Elemente.Wenn du in deinem ersten Beispiel Zeile 13 ersetzt durch
for(int i=0;i<length/sizeof(*x);i++) x[i] = y[i];
klappt das auch.
memcpy ist eigentlich* auch nur eine for-schleife.
*allerdings vom Compilerbauer hoffentlich hoch optimiert für große Speicheblöcke.
-
SeppJ schrieb:
PeterXY schrieb:
Das scheint zu funkionieren. Wieviel Overhead bekomme ich denn dazu? Das ganze läuft auf einem Microcontroller...
So ungefähr keinen bis hin zu weniger als bei deinem Eigenbau.
Wie kommt es, dass die Leute immer gleich einen Mikrocontroller programmieren, anstatt erst einmal 2-4 Wochen C zu lernen? Pointer, Arrays und Funktionen wirst du andauernd brauchen. Übernimm nicht einfach die fertige Lösung, ohne sie zu verstehen! Schau dir das Thema dringend noch einmal an!
Nichts für ungut, aber ich programmiere seit über 10 Jahren mit C Microcontroller und habe normalerweise keine Probleme mit "Pointer, Arrays und Funktionen". Die dargestellten Codeschnipsel sind stark reduziert und bereits vom Chiphersteller vorimplementiert. Dass die Hälfte in Assembler programmiert wurde und ich deshalb diverse für die andere Normalos lesbare Wrapper aussen herumschreibe, tut hier ja erstmal nicht zur Sacehe...
DirkB schrieb:
Das Problem in deinem ersten Beispiel ist die Zeile 13. Die macht nicht das, was du dir vorstellst.
Hast du dir schon mal length angesehen? Das gibt dir die Größe in Byte an.
Du behandelst es aber wie die Anzahl der Elemente.Wenn du in deinem ersten Beispiel Zeile 13 ersetzt durch
for(int i=0;i<length/sizeof(*x);i++) x[i] = y[i];
klappt das auch.
memcpy ist eigentlich* auch nur eine for-schleife.
*allerdings vom Compilerbauer hoffentlich hoch optimiert für große Speicheblöcke.
Danke, das habe ich mir auch schon gedacht, die Daten einfach über eine For-Schleife zu kopieren. Schöner wäre es diese mit "einem" Prozessortakt also direkte Zuweisung zu realisieren, aber das geht so in der Form wohl nicht.
-
Eine Zuweisung muss nicht immer ein Prozessortakt (atomar) sein.
Auch nicht bei integralen Typen wie int oder long.
Aber das solltest du wissen mit deiner Erfahrung.Wenn das aber feste Werte sind, die sich nicht ändern, kannst du ja mit Zeigern darauf arbeiten. Das geht dann (fast) in einem Prozessortakt.
-
DirkB schrieb:
Eine Zuweisung muss nicht immer ein Prozessortakt (atomar) sein.
Auch nicht bei integralen Typen wie int oder long.
Aber das solltest du wissen mit deiner Erfahrung.Das is klar. Sollte ja nur ein Euphemismus sein