Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » array und Zufall

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 ] > 2 < [ 3 ] [ 4 ] [ 5 ]
010
12.12.2007, 16:39 Uhr
xXx
Devil


Ja, deswegen hab ich ja auch die Funktion so geschrieben ^^ Das #define RAND_MAX ist Standard, als auch die Funktion rand.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
13.12.2007, 16:33 Uhr
wolf360



okey des mit der Zufallszahl hab ich etz endlich gschafft, blos häng ich etz dran das ergenis in eine Textdatei zu schreiben.... eigentlich weiße ich wie man in eine Textdatei schreibt blos mit diesen Arrays wills net klappen, entweder füllt sich die Textdatei blos mit Leerzeichen oder mit so komischen Rechtecken..."

Woran liegt das ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
13.12.2007, 21:45 Uhr
Hans
Library Walker
(Operator)


Hi,

hast du Dir die Datei schon mal mit einem Hex-editor angesehen?
Möglicherweise schreibst Du die Zahlen genau so in die Datei, wie sie auch im Rechner präsent sind. Wenn das so ist, dann vergisst Du dabei, das Du die Zahlen ins ASCII-Format umwandeln musst, bevor Du sie in die Datei schreibst.

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
013
14.12.2007, 18:52 Uhr
wolf360



lol mitm hex-editor.... da versteh ich kein wort... xD

und wie wandle ich die Zahlein ins ASCII-Formati um?

ich mein wenn ichs etz z.B. so mach:

C++:
while ( (c=getchar()) != EOF);{
    fputc(c,datei);
}



klappt alles...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
14.12.2007, 21:23 Uhr
Hans
Library Walker
(Operator)


Hi,

also mit 'nem Hexeditor sollte man sich schon auskennen, wenn man seinen Daten mal auf die Bits gucken muss. Wenn Du nicht weis, was ein Hexeditor überhaupt für ein Programm ist, siehe hier.

Was Du in dem Beispiel da machst, passt für Buchstaben und sonstige ASCII-codes, die nur ein Byte gross sind. Aber Zahlen wie int belegen in der Regel 4 Byte, wovon einige auch den Wert Null haben können. Da kommst Du mit get-/putchar nicht mehr weiter.

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
015
14.12.2007, 22:54 Uhr
Hans
Library Walker
(Operator)


Hier jetzt mal ein Beispiel:
Das Programm füllt ein 10 mal 10 Array mit Zufallszahlen und gibt sie aus. Beim erzeugen auch auf die Mattscheibe. Danach werden die erzeugten Zahlen in eine Datei geschrieben, und zwar 2 mal. Beim ersten mal so, wie sie auch auf dem Bildschirm erscheinen, beim zweiten mal so, wie sie im Rechner intern vorliegen. Um diese Form der Ausgabe richtig betrachten zu können ist ein Hexeditor notwendig. Aber hier erst mal das Programm:

C++:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int Random(int min, int max);

int main (void)
{
  int i, j;
  int array[10][10];
  FILE *datei;

  srand((unsigned)time(NULL));    /* Zufallsgenerator initialisieren */
  for (j=0; j<10; j++)            /* array mit Zahlen füllen */
    { for (i=0; i<10; i++)
        { array[j][i] = Random (1, 26);  
          printf ("%2d, ", array[j][i]); /* und ausgeben */
        }
      printf ("\n");
    }

  datei = fopen ("zahlen.txt", "w");    /* Datei öffnen */
  if (datei==NULL)
     { perror("Fehler beim öffnen der Datei ");
       exit(1);
     }
  
  /* Jetzt werden die eben erzeugten Zahlen in die Datei geschrieben. Man
     beachte, das zur Ausgabe die Funktion fprintf() verwendet wird.
  */

  for (j=0; j<10; j++)
    { for (i=0; i<10; i++)
        {
          fprintf (datei, "%2d, ", array[j][i]);
        }
      fprintf (datei, "\n");
    }

  /* Trennlinie in die Datei schreiben */
  fprintf (datei, "----------------------------------------\n");

  /* Jetzt werden die erzeugten Zahlen in die Datei geschrieben; - Aber so,
     wie sie auch Rechnerintern vorliegen, d.h. die Umwandlung nach ASCII, die
     fprintf() vornimmt, findet jetzt nicht statt.
  */

  for (j=0; j<10; j++)
    { for (i=0; i<10; i++)
        {
          fwrite(&(array[j][i]), sizeof(int), 1, datei);  /* */
          fprintf (datei, ",");    /* Komma als Orientierungsmarke */
        }
      fprintf (datei, "\n");
    }

  fclose (datei);

  return 0;
}

/* Funktion zum erzeugen der Zufallszahlen in einem bestimmten Intervall.
   Es ist die Gleiche, die xXx im Posting 008 geschrieben hat, nur auf
   umgetauft und mehrere Zeilen auseinander gezogen.
*/

int Random(int min, int max)
{
  int z;
  z = min + (int)((max - min + 1) * rand() / (RAND_MAX + 1.0));

  return z;
}



Wenn man die von dem Programm erzeugte Datei "Zahlen.txt" im Windoof-Editor betrachtet, sieht das etwa so aus:

Code:
7, 17,  9, 22, 21,  9,  9, 22, 14,  2,
18,  9,  9,  2, 14, 20, 23,  4, 21, 23,
1, 14,  3,  5,  4, 15, 23,  7,  6, 14,
3, 19, 17, 20,  1,  7,  5, 16, 20, 10,
8,  8, 20, 16, 18, 14, 21, 12, 23, 16,
9,  2,  8, 25, 14, 18,  8, 17, 15, 10,
8,  9, 15, 10,  1, 25, 12, 24,  2, 23,
1, 24, 24,  9,  3, 18, 14, 14, 14,  4,
14, 14, 17,  7, 16,  5, 23, 24, 12, 22,
13,  6, 23,  3, 25, 26, 19,  2, 12, 25,
----------------------------------------
,,    ,,,    ,    ,,,,
,    ,    ,,,,,,,,
,,,,,,,,,,
,,,,,,,,,
,
,,,,,,, ,,,
    ,,,,,,,,,
,
,    ,,
,,, ,,,,
,,,    ,,,,,,,
,,,,,,,, ,,

,,,,,,,, ,,



Soweit erst mal das. Wie der zweite Teil, also unter der Linie als Hexdump (so nennt man die Ausgaben von Hexeditoren auch) aussieht, folgt später noch, sofern Bedarf besteht.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 14.12.2007 um 22:59 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
14.12.2007, 23:35 Uhr
wolf360



Was ein Hexeditor is weiß ich scho, blos wofür man ihn brauch hab ich nicht wirklich herausgefunden....

Ich hab die ganz Zeit probiert mit fputc irgendwie das Array in die Datei zu bekommen, und da wurdn nur die Vierecke angezeigt.

Was ich an deinem Programm nicht verstehe is das du in die Datei mit fprintf schreibst?!

Ich hätt gemeint mit dieser Funktion schreibt man formatiert einen String?
Und was ist das für ein Format "%2d, " ?

gruß wolf360
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
15.12.2007, 04:51 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat von wolf360:
Was ein Hexeditor is weiß ich scho, blos wofür man ihn brauch hab ich nicht wirklich herausgefunden....

Nun, in diesem Beispiel offenbart uns ein Hexeditor, was sich genau hinter den Vierecken verbirgt. Denn die Vierecke bedeuten ja, das sich an der Stelle Bytes befinden, die der Windowseditor nicht anzeigen kann, weil sie keinen darstellbaren Zeichencodes entsprechen.


Zitat von wolf360:
Ich hab die ganz Zeit probiert mit fputc irgendwie das Array in die Datei zu bekommen, und da wurdn nur die Vierecke angezeigt.

weil fputc auch nur für char-daten gedacht ist, d.h. darstellbare Zeichen.


Zitat von wolf360:
Was ich an deinem Programm nicht verstehe is das du in die Datei mit fprintf schreibst?!

So wie man mit printf irgendwas auf den Bildschirm ausgibt, so gibt man mit fprintf das Gleiche in eine Datei aus.
Als Eselsbrücke kann man sich merken: Das f am Anfang eines Funktionsnamens steht für file, d.h. immer wenn eine Funktion mit f anfängt, hat sie irgendwas mit Dateibearbeitung zu tun. - Gilt jedenfalls für C, in C++ kann es anders sein.


Zitat von wolf360:
Ich hätt gemeint mit dieser Funktion schreibt man formatiert einen String?

Nö, dafür is sprintf zuständig.


Zitat von wolf360:
Und was ist das für ein Format "%2d, " ?

Das bedeutet, das die Zahlen immer zweistellig ausgegeben werden sollen. Wenn die Zahl nur eine Stelle hat, wird anstatt der Zehnerstelle ein Leerzeichen ausgegeben. Das kannst Du an Deinem Rechner besser sehen, - die Forumssoftware hat im obigen Beispiel leider die Leerzeichen am Anfang der Zeilen verschluckt.

Wenn Du also einen Hexeditor hast, dann sieh Dir die Datei, die das Programm erzeugt, mal damit an. Ab der Linie, also der Adresse 01ce sieht das für obiges Beispiel so aus:

Code:
      00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f  0123456789abcdef
01c0                                            07 00                 .
01d0  00 00 2c 11 00 00 00 2c 09 00 00 00 2c 16 00 00  .., ..., ..., ..
01e0  00 2c 15 00 00 00 2c 09 00 00 00 2c 09 00 00 00  ., ..., ..., ...
01f0  2c 16 00 00 00 2c 0e 00 00 00 2c 02 00 00 00 2c  , ..., ..., ...,
0200  0d 0a 12 00 00 00 2c 09 00 00 00 2c 09 00 00 00     ..., ..., ...
0210  2c 02 00 00 00 2c 0e 00 00 00 2c 14 00 00 00 2c  , ..., ..., ...,


Das sind nur die ersten 5 Zeilen, es sind noch ein paar mehr. (Ich hab hier die Vierecke durch Leerzeichen, bzw. Punkte ersetzt.) Hoffe, es wird klar was das soll. Erste Spalte: Adresse der Bytes in der Datei, dann 16 Spalten die Bytes der Datei in hexadezimaler Darstellung, danach die gleichen Bytes als ASCII-Codes, sofern sie als solche darstellbar sind.
Wir sehen da in regelmässigen Abständen das Byte 2c, was dem Komma entspricht, danach irgend ein Byte gefolgt von 3 Nullbytes, was jeweils die int-Zahl ist, die in der Datei steht. Als erstes die 7, als 4 Byte gosse int-Zahl: 07 00 00 00. Danach eine 17, codiert als 11 00 00 00.
Alles klar?


Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 15.12.2007 um 04:58 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
15.12.2007, 14:47 Uhr
wolf360



okey erstmal danke für die hilfe!!

okey zu dem Hexcode ein paar fragen:

okey 2c is komma und des 00 für die Punkte, aber warum stehn ab und zu noch so 16 oder 0e drin?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
15.12.2007, 16:33 Uhr
Hans
Library Walker
(Operator)


Hi,

2c entspricht dem Komma, das ist richtig. Aber des 00, also die Nullbytes sind nicht als Zeichen darstellbar. Deshalb schreiben viele Hexeditoren an der Stelle einen Punkt, der dann bedeutet, dass das Zeichen nicht darstellbar ist. Wenn Du stattdessen mal eine Textdatei im Hexeditor betrachtest, findest Du für den Punkt den Code 2e.
Die anderen Bytes wie 16 oder 0e sind genau die Werte der Zahlen, die aus deinem Array stammen. Nehmen wir mal wieder mein Beispiel aus Posting 015. Da steht in der ersten Zeile:

Code:
7, 17,  9, 22, 21,  9,  9, 22, 14,  2,

Die hexadezimale Form, also so wie es im Speicher steht, ist diese:

Code:
Addr   0  1  2  3  4  5  6  7    8  9  a  b  c  d  e  f
0000  07 00 00 00 2c 11 00 00   00 2c 09 00 00 00 2c 16
0010  00 00 00 2c 15 00 00 00   2c 09 00 00 00 2c 09 00
0020  00 00 2c 16 00 00 00 2c   0e 00 00 00 2c 02 00 00
0030  00 2c

Da steht also zuerst mal die Bytefolge 07 00 00 00, das entspricht der 7. Und zwar als 32-Bit int-Wert. int-Zahlen haben heutzutage 32-Bit, d.h. sie belegen 4 Byte im Speicher. Dann folgt das Byte 2c, was dem Komma entspricht. Danach die Bytefolge 11 00 00 00; das ist die 17. Dann wieder das Komma (2c), danach 09 00 00 00, was der 9 entspricht.
Das waren jetzt die ersten drei Zahlen aus dem Array. Die restlichen sieben Zahlen aus der ersten Zeile kannst Du aus der hexadezimalen Darstellung jetzt selber heraus lesen, denke ich mal.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 15.12.2007 um 16:37 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ] [ 4 ] [ 5 ]     [ 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: