Announcement

Collapse
No announcement yet.

array.Length - 200 ?!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • array.Length - 200 ?!

    wie es es ja schon im titel steht, hab ich ein kleines problem, was mich fast verzweifeln lässt ...


    mein code an dieser stelle sieht folgendermaßen aus

    Code:
    for (int i = buffer_arr.Length - 200; i < buffer_arr.Length; i++)
    {
    
    richTextBox1.Text = richTextBox1.Text + buffer_arr[i].ToString();
    
    }

    was mache ich nur falsch, es l9iegt irgendwie an der -200 ..

    wenn ich schreiben würde


    Code:
    for (int i = o; i < buffer_arr.Length; i++)
    {
    
    richTextBox1.Text = richTextBox1.Text + buffer_arr[i].ToString();
    
    }

    dann würde es funktionieren, wisst ihr, wie man es machen muss ??

  • #2
    hallo

    komisch, bei mir funktioniert es:

    Code:
    string[] arr = new string[10];
    
                for (int i = arr.Length - 10; i < arr.Length; i++)
                {
    
                    Console.WriteLine("Value: " + arr[i]);
                }

    Comment


    • #3
      Warum nimmst du dann nciht die Lösung, die funktioniert?

      Schon mal

      for (int i = (buffer_arr.Length - 200);

      probiert?
      Christian

      Comment


      • #4
        hmm, bei mir wills nicht ... warum auch immer ... also wie gesagt, wenn ich gleich null setze funktiioniert das ...


        achja, vielleicht liegts daran, es ist ein char[] arr

        Comment


        • #5
          for (int i = o;
          Das soll 0 sein??

          wie groß ist überhaupt das Array? Welchr Fehler kommt?
          Christian

          Comment


          • #6
            Originally posted by jonas.woehl View Post
            hmm, bei mir wills nicht ... warum auch immer ...
            Woran erkennst Du denn, dass es nicht funktioniert? Warum überlässt man potenziellen Helfern immer das Raten: Ist es eine Meldung des Compilers oder eine Exception zur Laufzeit oder ein nicht erwartetes Ergebnis? Welche Meldung, welche Exception?

            Originally posted by jonas.woehl View Post
            also wie gesagt, wenn ich gleich null setze funktiioniert das ...
            Du meinst wohl gleich 0; null ist nicht dasselbe.

            Und Christians Hinweis ist auch nicht von der Hand zu weisen: 'o' ist natürlich noch etwas anderes.

            Originally posted by jonas.woehl View Post
            achja, vielleicht liegts daran, es ist ein char[] arr
            Das ist nicht anzunehmen. Ein Array hat die Eigenschaft Length - gleichgültig, ob es sich um char-Array oder DataTable-Array oder myOwnClass-Array handelt.

            Eher ist zu vermuten, dass die Schleife mit einer Länge von weniger als 200 Elementen aufgerufen wird und es dann eben bei einem negativen Startindex knallt. Aber wie gesagt: ohne nähere Informationen ist das nur Kaffeesatz-Leserei.

            Außerdem möchte ich Dich davor warnen:
            Code:
            richTextBox1.Text = richTextBox1.Text + buffer_arr[i].ToString();
            Ein String ist unter NET grundsätzlich unveränderlich. Wenn er per Addition verändert wird, muss ständig ein neuer String im Arbeitsspeicher erzeugt, der alte umkopiert und dann gelöscht werden - eine grausame Belastung des Arbeitsspeichers. Dafür gibt es fast immer bessere Verfahren, z.B. RichTextBox.AppendText oder die StringBuilder-Klasse.

            Jürgen

            Comment


            • #7
              ok, das eine war ein tippfehler, ich meinte i = 0


              ich habe jetzt warscheinlich das problem : du hattest recht ... 200, so viel zeichen hat das bild gar nicht, dass ich auslesen will ...



              nochmal zu meinem programm ::

              i9ch habe einen openFileDialog und mit dem wählt man eine bilddatei von beliebeigen typ aus ---

              dann wird das Bild so eingelesen, mit der zeichenfolge, die einem auch angezeigt wird, wenn man ein Bild im Editor sich anschaut

              ja, und das problem bei - 200 war, dass er es zwar eingelesen hat, aber in der richTextBox , in der der Wert dann angezeigt werden soll, wurde nichts angezeigt, und er war aber mit dem prozess des einlesens fertig ...


              aber jetzt scheints zu klappen ... danke ...




              Achja, also ich will sozusagen den aufwand für den prozessor kürzen, denn so ein Vildcode ist ja schonmal 8000 zeichen lang bei einem .jpg ...

              und dann müsste er die for schleife 8000 mal durchlaufen, und dann hängt er sich bei mir auf ... also dachte ich, fütr mich würde es reichen nur die letzten 200 zeichen zu durchlaufen ...


              vcon daher - 200

              aber, das will schon wieder nicht funktionieren, es sieht so aus, wie als würde er bei der schleife

              Code:
              for (int i = (buffer_arr.Length - 50); i < buffer_arr.Length; i++)
              {
              richTextBox1.Text.AppendText(buffer_arr[i].ToString());
              }
              einfach nicht nur die letzten 50 zeichen berechnen, sondern das ganze array ... von daher, is ein bisschen doof, wisst ihr warum ...


              also programm lässt sich schon ausführen etc. aber er stürzt halt dann ab, weil er wieder die 800 zeichen durchläuft in der for schleife ...
              Zuletzt editiert von jonas.woehl; 31.07.2008, 10:56.

              Comment


              • #8
                Ich verstehe Dein Problem überhaupt nicht mehr: Willst Du den Dateinamen in die RichTextBox übernehmen oder alle Bytes der Bilddatei? Letzteres kann ich mir überhaupt nicht sinnvoll erklären; die erste Lösung wäre doch ganz einfach:
                Code:
                RichTextBox.Text = openFileDialog1.Filename;
                Also was soll das? Jürgen

                Comment


                • #9
                  man ... soll, ich dir jetzt mein ganzes programm erklären ?!

                  von mir aus, der sinn von meinem programm ist, einen text, den der benutzer frei wählen kann, in einer bilddatei zu verstecken ...

                  das reinschreiben funktiioniert auch

                  aber ich will den text halt auch wider einlesen ... beim text in die datei schreiben, wird der txt hinten agehangen, da er dort die datei nicht beschädigt ..

                  so, und jetzt wil lich den text mit meinem programm aber auch wieder einlesen können ...


                  und da würde ich sagen, ich lese die letzten 200 zeichen in mein progrtamm in eine richTextBox ein ... (richTextBox1)


                  so und in richTextBox2 kann man jetzt text eingeben und den dann wieder in die Bilddatei speichern ... ist das verständlich ? =)

                  Comment


                  • #10
                    Hallo Jonas,

                    in diesem Fall ist eine solche Erklärung sehr hilfreich. Dein buffer_arr ist also der Inhalt der gesamten Datei. Es fehlt die Erklärung, wie Du bei Deinem letzten Code darauf kommst, dass die gesamte Datei bearbeitet wird und nicht nur die letzten 50 Zeichen.

                    Vorschlag: Speichere als letzte Bytes die Länge des eingegebenen Textes sowie eine feste Kennung, mit der Du prüfen kannst, ob überhaupt ein Text angehängt wurde. Dann kannst Du zwischen einer originalen Bilddatei und einer veränderten unterscheiden und hast das Problem gelöst, wie weit Du zurückgehen musst.

                    Unabhängig davon geht das Übernehmen des Textes noch einfacher:
                    Code:
                    int currentLength = 50;
                    for (int i = (buffer_arr.Length - currentLength); i < buffer_arr.Length; i++)
                    {
                        richTextBox1.AppendText(buffer_arr[i].ToString());
                    }
                    Jürgen
                    Zuletzt editiert von Jürgen Thomas; 31.07.2008, 11:23. Reason: ToString() nachgetragen; darauf darf leider nicht verzichtet werden.

                    Comment


                    • #11
                      es geht auch ganz ohne Schleife

                      richTextBox1.AppendText(new String(buffer_arr));

                      Comment


                      • #12
                        ok, danke erstmal, das mit dem speicher der textlänge mache ich ... das hatte ich mir auch schonmal überlegt ..


                        aber ich habe das problem immernoch ...

                        wenn ich das bild einlesen, mit der schleife, die du vorgschlagen hast, Jürgen, dann zeigt er keinen Text an, egalk bei welchem typ von bild (.jpg, .gif) aber bei bmp klappts, da zeigt er auch den eingelesen text ein --.

                        also, wenn ich das schritt-für-schritt debuggen durchführe (F11) dann sehe ich, dass er auch was in das array schreibt (821446 zeichen bei einem .jpg)

                        udn er durchläuft die schleife auch mit der currentLength variable also so viel mal, wie man in die variable schreibt, das funzt alles ...

                        aber der text den ich jetzt angeziegt bekomme sieht so aus, wie wenn man nen bild einfach über einen streamreader einließt mit folgendem code


                        Code:
                        StreamReader Einlesen = new StreamReader("C://dasbild.jpg");
                        Einlkesen.ReadToEnd();
                        Einlesen.Close();
                        da würde man dann annähernd so eine zeichenfolge bekommen : "[][][][][]" und die bekomme ich jetzt, obwohl ich den streamreader ja nicht so verwende ---



                        es würde dir alles einfacher machen, wenn ich dir den ganzen quellcode poste, soll ich, oder wie siehts aus ?

                        ich weiss überhaupt nicht, woran das liegen soll, dass er es nicht macht =)


                        eine gewollte ausgaben wäre (bei einem bild, in dem schon text eingeschrieben ist) :

                        "OÄKJHASSHD)A/("§NJLSHADLKAD(="klajd8oasdaod8(&/DASjdhasdJKHSADerText"

                        Comment


                        • #13
                          Hallo Ralf,

                          es war gut, dass Jonas sein Projekt erläutert hat; dadurch ist klar, dass Deine Lösung zu einfach ist. Die String-Konstruktoren gehen von char-Array aus, aber nicht von byte-Array. Außerdem will Jonas nicht alle Zeichen übernehmen, sondern nur die letzten 50 (oder so).

                          Am ehesten passt der String-Konstruktor (SByte*, Int32, Int32). Aber dann kommt das Problem "Zeiger".

                          Hallo Jonas,

                          mich würde interessieren, wie buffer_arr deklariert, erzeugt und mit Inhalt versehen wird.

                          Jürgen
                          Zuletzt editiert von Jürgen Thomas; 31.07.2008, 11:51. Reason: zuviele Beiträge auf einmal

                          Comment


                          • #14
                            ok ... ich schreibs mal schnell ab : das ist so ziemlich der kernteil der umwandlung ...

                            Code:
                                                
                            //Text aus der Bilddatei einlesen
                            StreamReader Einlesen = new StreamReader(openFileDialog1.FileName);
                            pic_path = openFileDialog1.FileName;
                            richTextBox1.Text = Einlesen.ReadToEnd();
                            Einlesen.Close();
                            
                            
                            //Daten des Bildes in Array schreiben
                            Char[] buffer_arr = new Char[Einlesen.BaseStream.Length];
                            Einlesen.Read(buffer_arr, 0, (int)Einlesen.BaseStream.Length);
                            Einlesen.Close();
                            
                            int currentLength = 50;
                            
                            
                            
                            //Jedes Byte einzeln umrechnen und in die RichTextBox einfügen
                            for (int i = (buffer_arr.Length - currentLength); i < buffer_arr.Length; i++)
                                                {
                            
                                                    richTextBox1.AppendText(buffer_arr[i].ToString());
                            
                                                }

                            Comment


                            • #15
                              Wie hast du den Text an das Bild gehängt?
                              Dem Streamreader hast du kein Encoding mitgegeben, das heißt er versucht es selbst aus dem ByteOrderMark der Datei zu bestimmen. Wen er mit einem anderen Encoding liest als du es ursprünglich reingeschrieben hast kommt natürlich unfug zurück.


                              @Jürgen: Der Code sollte so einfach wie möglich sein, aber natürlich nicht einfacher

                              Comment

                              Working...
                              X