Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » 2D Zeigerfeld

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
03.12.2007, 19:32 Uhr
tester34



Hallo,

könnt ihr mir beim folgenden Programm zur Seite stehen.
Es liest Sätze ein, die in einem 2D Pointer Array gespeichert werden. Per Bubblesort wird das ganze sortiert und anschließend die längste Zeile am Anfang ausgegeben.
Das ganze bitte in C, mir gehts um ein besseres Verständnis für pointer und malloc.

Vom prinzip sollte das programm korrekt sein, lediglich beim vertauschen der pointer und beim einlesen der sätze hakt es.
Die Ausgebeschleife nach /*TEST*/ ist lediglich zu Testzwecken, hier liegt irgendwo ein fehler. Als ausgabe erhalte ich nur die letzte eingegebene Zeile, anschließend stürzt der laden ab...
Danke!

mfg tobi


C++:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
const int S=999; /*Spalten*/
const int Z=1000; /*Zeilen*/

void sortieren(char**,int);                

main()
{
  char** text;  /* 2D Zeigerfeld = char* text[] */
  char* hilf =(char*) malloc(S * sizeof(char));                  
  int AnzahlZeilen=-1,k;
  puts("\nBitte geben Sie beliebige Saetze ein:\n(Abbruch durch Eingabe einer \"leeren\" Zeile)\n\n");
  text =(char**) malloc(Z * sizeof(char*));  
  do
  {
     AnzahlZeilen++;
     gets(hilf);
     *(text+AnzahlZeilen)=(char*) malloc((strlen(hilf)+1) * sizeof(char));
     strcpy((*(text+AnzahlZeilen)),hilf);                            
  }
  while(strlen(hilf)>0);
  if(strlen(*(text+AnzahlZeilen))==0)
  {
     AnzahlZeilen--;
  }
  /*TEST*/
   for(k=AnzahlZeilen;k>=0;k--)
    {
       puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
       puts(*(text+AnzahlZeilen));          /*text[k] entspricht *(text+AnzahlZeilen)*/
}  
/**/    
  puts("Absteigend sortierte Ausgabe:\n");
  sortieren(text, AnzahlZeilen);
  puts("\n\n\n");
  system("PAUSE");
  return 0;    
}

void sortieren(char** text, int AnzahlZeilen)
{
  int x,y,l1,l2,k=0;
  char* tmp;
  for (x=0;x<=AnzahlZeilen;x++)
  {
     for(y=0;y<=AnzahlZeilen;y++)
     {
        l1=strlen(*(text+y));          /*Länge String y*/
        l2=strlen(*(text+y+1));        /*Länge String y+1*/
        if((y<AnzahlZeilen)&&(l1>l2))                                                          
        {
         *tmp=*(text+AnzahlZeilen); /*????????????????*/
         *(text+AnzahlZeilen)=*(text+AnzahlZeilen+1);
         *(text+AnzahlZeilen+1)=*tmp;
        }
     }
  }
  for(k=AnzahlZeilen;k>=0;k--)
    {
       puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
       puts(*(text+AnzahlZeilen));          /*text[k] entspricht *(text+AnzahlZeilen)*/
    }
  for(k=AnzahlZeilen;k>=0;k--)
  {
     free(text[k]);
  }
  puts("\nSpeicher wurde wieder freigegeben!\n");
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.12.2007, 23:08 Uhr
Hans
Library Walker
(Operator)


Hi,

also mein Compiler meldet mir 'ne "Nonportable pointer conversion in function sortieren", und zwar hier:

C++:
void sortieren(char** text, int AnzahlZeilen)
{
  ...
        l1=strlen(*(text+y));          /*Länge String y*/
        l2=strlen(*(text+y+1));        /* <<<--- Hier kommt die Fehlermeldung!  Länge String y+1*/
        if((y<AnzahlZeilen)&&(l1>l2))                                                          
        {
     ...



Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.12.2007, 15:08 Uhr
xXx
Devil


Hmm magst du mir mal erklären, wie du darauf kommst:

C++:
puts(*(text+AnzahlZeilen));


Zitat:
text[k] entspricht *(text+AnzahlZeilen)
?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.12.2007, 22:25 Uhr
tester34



@xXx
ein 2D Zeigerfeld kann ich doch mit Pointer Schreibweise und Feld Schreibweise ansprechen.
hier ein 2D Feld "beispiel[][]", wobei felder auch immer mehr oder weniger zeiger sind!

text[k] zeigt auf Zeile k, ebenso
*(text+AnzahlZeilen)


mittlerweile funktioniert mein programm soweit, das "nur" mehr die zeigertauschung ein Problem ist. Kann mir hier wer helfen?

Wie vertausche ich hier die pointer, also um den inhalt nicht per strcpy vertauschen zu müssen?

C++:
          &tmp=*(text+AnzahlZeilen);
         *(text+AnzahlZeilen)=*(text+AnzahlZeilen+1);
         *(text+AnzahlZeilen+1)=&tmp;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: