einfache Verscheibung von feldern.
-
Pjottre 500 schrieb:
Kann da mal ein jemand drüber schauen warum das nicht geht
Das kann schon mal deshalb nicht gehen, weil deine Funktion tausche() zwar ein
int array[10]
annimmt, aber nicht verändert. Wenn ich mich nicht verschaut hab, rufst du die Funktion ja nicht einmal auf, wie soll sie dann was tun?
-
Du bist im falschen Forum, Strings in Streams shiften ist C++.
Benutze bitte [cpp][/cpp]-Tags das macht alles lesbarer.
Dein Funktionsaufruf
int tausch(int, int array[10]);
in der dritten Zeile von main funktioniert nicht, es sollte irgendwie
tausch(i, array);
heißen.
Deine Funktion tausch soll ein int zurückgeben, steht jedenfalls da. Es fehlt aber das return. Wahrscheinlich willst du void tausch und nicht int tausch.
Du kannst tausch nicht aufrufen bevor es definiert ist. Schreibe
void tausch(int, int array[10]);
vor die mainfunktion, dann ist tausch bekannt.
Bei deinem Aufruf hat i noch keinen Wert, du musst i erst einen Wert geben bevor du es im Aufruf sinnvoll benutzen kannst.
Du kannst übrigens deine Elemente gleich um n Elemente verschieben und nicht immer nur um eins.
-
^^versuch mal dies:
#include <stdio.h> #include <stdlib.h> #include <string.h> void rotate_right (int *array, int size, int num) { int *tmp = malloc (num*sizeof(int)); // zwischenspeicher if (tmp) { num = num % size; // drehungen / size wiederholen sich memmove (tmp, array+size-num, num*sizeof(int)); // rechten teil retten memmove (array+num, array, (size-num)*sizeof(int)); // linken teil ueber rechten kopieren memmove (array, tmp, num*sizeof(int)); // rechten teil vorne dran free (tmp); } } void print (int *array, int size) { int i; for (i=0; i<size; i++) printf ("%d ", array[i]); puts (""); } #define LENGTH(a) (sizeof(a)/sizeof(*a)) int main (void) { int array[] = {0,1,2,3,4,5,6,7,8,9}; // original print (array, LENGTH(array)); // ausgeben rotate_right (array, LENGTH(array), 4); // 4 mal nach rechts print (array, LENGTH(array)); // ausgeben rotate_right (array, LENGTH(array), 7); // 7 mal nach rechts print (array, LENGTH(array)); // ausgeben system("pause"); }
-
;fricky schrieb:
^^versuch mal dies:
...
Da würd's memcpy() auch tun, oder?
-
µngbd schrieb:
Da würd's memcpy() auch tun, oder?
ich glaub schon, zumindest der erste und der dritte. beim mittleren bin ich mir nicht sicher, musste mal 'nen standard-auswendigkenner fragen.
-
fricky schrieb:
zumindest der erste und der dritte. beim mittleren bin ich mir nicht sicher
Ich glaub das stimmt, der mittlere muss ein memmove() sein. Nämlich für den Fall, dass n kleiner ist als die Hälfte, dann überlappt das Verschieben.
Ich wollte ja eigentlich schnell ein memcpy() schreiben, damit nichts unerklärt bleibt, aber memmove() ist mir schon zu anstrengend.
-
Pjottre 500 schrieb:
Kann da mal ein jemand drüber schauen warum das nicht geht, kann es nicht anders lösen, da ich absoluter Neuling bin und noch nicht viele Funktionen kenne, deshalb muss es auf diese Weise gelöst werden.
Du mußt in deiner Funktion tausch das Array array auch benutzen.
;fricky schrieb:
^^versuch mal dies:
//.. zensiert
Wer hat letztens noch über memset und co. gelästert?
-
Big Brother schrieb:
;fricky schrieb:
^^versuch mal dies:
//.. zensiert
Wer hat letztens noch über memset und co. gelästert?
hier passt memcpy/memmove aber ganz gut. das mit dem 'malloc' finde ich schlimmer (war eh' nur ein schneller hack). in wirklichkeit hätte ich so'ner funktion einen pointer auf speicher mitgegeben, den sie benutzen kann. das kann wenigstens nicht schiefgehen (so wie malloc).
-
;fricky schrieb:
in wirklichkeit hätte ich so'ner funktion einen pointer auf speicher mitgegeben, den sie benutzen kann. das kann wenigstens nicht schiefgehen (so wie malloc).
Du meinst einen Zeiger auf ein Hifsarray der gleichen Größe, ne.
Geht dann btw. auch ohne memmove/memcpy.Genial ist dieser von volkard verlinkte Block Swap Algorithm. Der kommt mit sehr wenig Hilfsspeicher aus.
-
Big Brother schrieb:
Genial ist dieser von volkard verlinkte Block Swap Algorithm.
oder das hier: http://www.azillionmonkeys.com/qed/case8.html