Resource icon

[C] Reverse Funktion - Reihenfolge der Elemente eines Array-Bereichs umkehren

Programmiersprache(n)
C (ANSI, abwärtskompatibel)
Betriebssystem(e)
unspezifisch
Diese Funktion kopiert Arrayelemente in einem Bereich so, dass sie anschließend in umgekehrter Reihenfolge vorliegen. Der Bereich wird durch einen Pointer auf das erste Element und die Anzahl der darauffolgenden umzukehrenden Elemente angegeben.
Da mit einem Pointer auf void gearbeitet wird, kann die Funktion unabhängig vom Typ des Arrays verwendet werden (also auch auf C-Strings, wobei dabei die Nullterminierung außerhalb des umzukehrenden Bereichs liegen muss). Der Entwickler ist dafür verantwortlich, dass die exakte Größe eines Elements übergeben wird. Die Funktion ist nicht in der Lage solche Fehler abzufangen.

C:
#include <stdio.h>
#include <string.h>

/** \brief  Reihenfolge der Elemente eines Array-Bereichs umkehren
*
*  \param  ptr    Pointer auf das erste Element im Bereich
*  \param  num    Anzahl Elemente im Bereich
*  \param  tsize  Typgröße eines Elements in Bytes
*
*  \return int    1 bei Fehler, sonst 0
*/
int Reverse(void *const ptr, const size_t num, const size_t tsize)
{
  // Plausibilitätsprüfung
  if (!ptr || !num || !tsize)
    return 1;

  // Pointer auf das erste (linke) und das letzte (rechte) Element ;
  // iterieren, solange der rechte Pointerwert größer als der linke ist ;
  // das linke Element um die Typbreite inkrementieren ,
  //   das rechte entsprechend dekrementieren
  for (char *left = (char*)ptr, *right = left + (num - 1) * tsize; right > left; left += tsize, right -= tsize)
    // Pointer auf das erste Byte im linken und im rechten Element ,
    //   Pointer auf das Ende des linken Elements ,
    //   Hilfsvariable für das byteweise Swapping ;
    // iterieren, solange das Ende des linken Elements nicht erreicht ist ;
    // jedes Byte des linken, gegen das des rechten Elements swappen
    for (char *first = left, *second = right, *end = first + tsize, c = 0; first < end; c = *first, *first++ = *second, *second++ = c);

  return 0;
}


// Beispiel:

struct foo
{
  int x;
  char y;
};

int main(void)
{
  struct foo arr0[] = {{3, 'c'}, {2, 'b'}, {1, 'a'}};
  printf("%d %c\t%d %c\t%d %c\n", arr0[0].x, arr0[0].y, arr0[1].x, arr0[1].y, arr0[2].x, arr0[2].y);
  Reverse(arr0, 3, sizeof(struct foo));
  printf("%d %c\t%d %c\t%d %c\n\n", arr0[0].x, arr0[0].y, arr0[1].x, arr0[1].y, arr0[2].x, arr0[2].y);

  int arr1[] = {4, 3, 2, 1};
  printf("%d %d %d %d\n", arr1[0], arr1[1], arr1[2], arr1[3]);
  Reverse(arr1, 4, sizeof(int));
  printf("%d %d %d %d\n\n", arr1[0], arr1[1], arr1[2], arr1[3]);

  char arr2[] = "!dlroW olleH";
  printf("%s\n", arr2);
  Reverse(arr2, strlen(arr2), 1);
  printf("%s\n\n", arr2);

  char arr3[] = "Tmo dna Jyrre";
  printf("%s\n", arr3);
  Reverse(&arr3[1], 2, 1);
  Reverse(&arr3[4], 3, 1);
  Reverse(&arr3[9], 4, 1);
  printf("%s\n\n", arr3);

  return 0;
}
Ausgabe des Beispiels:
Code:
3 c     2 b     1 a
1 a     2 b     3 c

4 3 2 1
1 2 3 4

!dlroW olleH
Hello World!

Tmo dna Jyrre
Tom and Jerry
Autor
German
First release
Last update
Bewertung
0,00 Stern(e) 0 Bewertungen
Oben