AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung?

Offene Frage von "Sir Rufo"
Ein Thema von Wulli12 · begonnen am 26. Dez 2013 · letzter Beitrag vom 26. Dez 2013
Antwort Antwort
Seite 1 von 2  1 2      
Wulli12

Registriert seit: 25. Dez 2013
4 Beiträge
 
#1

Zugriffsverletzung?

  Alt 26. Dez 2013, 01:11
Ich habe in meinem Programm eine function, welche mir einen gegebenen string sortieren soll.

z.B. : '7,3,11,5,1' --> '1,3,5,7,11'

Dazu gebe ich meiner function einen string in solch einer Form, also durch Kommas abgetrennte Zahlen. Daraufhin soll es die einzelnen Zahlen separieren und in einem Array aufteilen. Daraufhin durch meinen Such-Algorithmus die einzelnen Glieder jeweils vergleichen und in ein anderes Array in geordneter Reihenfolge kopieren. Und als Ausgabe diese einfach wieder durch Kommas getrennt als einzelnen string ausgeben.

Ich denke vom Verfahren her ist mein Code in Ordnung, jedoch bekomme ich immer den folgenden Error:

Zugriffsverletzung bei Adresse 00403EBC in Modul 'psort.exe'. Lesen von Adresse 00000004.

Hier noch einmal mein Delphi-Code:

Delphi-Quellcode:
unit msort;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Edit1Change(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

function sortString(input: string): string;
  var i, j, x: integer;
      output, rest: string;
      unsorted, sorted: array of string;
begin

  rest:= input;
  i:= 1;

  repeat

  if pos(',', rest) <> 0 then
  begin

    unsorted[i]:= copy(rest, i, pos(',', rest) - 1);
    rest:= copy(rest, pos(',', rest) + 1, length(rest));
    i:= i + 1;

  end;

  if pos(',', rest) = 0 then
  begin

    unsorted[i]:= copy(rest, 1, length(rest));
    rest:= '';

  end;

  until rest = '';

  for i:= 1 to length(unsorted) do
  begin

  x:= i;

  for j:= 1 to length(unsorted) do
  begin

      if (j <> i) and (unsorted[j] <> '') then
      begin

        if strtofloat(unsorted[x]) < strtofloat(unsorted[j]) then
        begin

          x:= j;

        end;

      end;

    end;

    sorted[i]:= unsorted[x];

  end;

  output:= sorted[1];

  for i:= 2 to length(sorted) do
  begin

  output:= output + ',' + sorted[i];

  end;

  result:= output;

end;

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
begin

  Edit2.Text:= sortString(Edit1.Text);

end;

end.
Ich hoffe mir kann jemand sagen, worin genau mein Fehler liegt, denn ich habe keine Ahnung was ich falsch gemacht haben könnte. Und schon einmal Danke im vorraus.
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#2

AW: Zugriffsverletzung?

  Alt 26. Dez 2013, 01:23
Du benutzt ein dynamisches Array of String, setzt aber nirgendwo dessen Größe. Entweder mit SetLength die Größe setzen oder ein statisches Array of String verwenden (das dann immer die angegebene Anzahl von Elementen hat).

Übrigens: Wenn du mit dem Debugger durchsteppst (F7 bzw. F8), wirst du sehen, wo der Fehler auftritt. Allerdings muss die dann markierte Zeile nicht die eigentliche Ursache sein.

MfG Dalai
  Mit Zitat antworten Zitat
Wulli12

Registriert seit: 25. Dez 2013
4 Beiträge
 
#3

AW: Zugriffsverletzung?

  Alt 26. Dez 2013, 02:00
Danke für deine schnelle Hilfe, ich habe nun probiert die Längen meiner Arrays nach einer anderen function zu setzen, welche mir die nötige Länge ermittelt, bekomme jedoch nun immer einen Error von einer ungültigen Zeigeroperation, aber was ist damit gemeint?

Habe meinen Code um folgendes erweitert:

Delphi-Quellcode:
function testLength(input: string): integer;
  var rest: string;
      counter: integer;
begin

  input:= rest;
  counter:= 0;

  repeat

  if pos(',', rest) <> 0 then
  begin

    rest:= copy(rest, pos(',', rest) + 1, length(rest));
    counter:= counter + 1;

  end;

  if pos(',', rest) = 0 then
  begin

    rest:= '';
    counter:= counter + 1;

  end;

  until rest = '';

  result:= counter;

end;
Delphi-Quellcode:
  setLength(unsorted, testLength(input));
  setLength(sorted, testLength(input));
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#4

AW: Zugriffsverletzung?

  Alt 26. Dez 2013, 02:07
Nun, schrumpfen wir's mal auf das Wesentliche zusammen:
Delphi-Quellcode:
function testLength(input: string): integer;
  var rest: string;
      counter: integer;
begin

  input:= rest;
  counter:= 0;

  result:= counter;

end;
Fällt dir was auf?

MfG Dalai
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Zugriffsverletzung?

  Alt 26. Dez 2013, 02:11
Statt einem Array of String kannst du auch eine TStringList nehmen.

Setze doch auch mal einen Breakpoint in function sortString bei rest:= input; (in die Zeile gehen und F5 drücken).

Wenn du das Programm dann mit F9 startest, hält der Debugger an der Stelle an und du kannst mit F8 durch die Funktion steppen, bzw. mit F7 in eine Funktion reinsteppen. Wenn du mit der Maus dann über Variablen gehst, siehst du auch deren Werte bzw Inhalte.

Dadurch kannst du besser nachvollziehen, warum dein Code Probleme macht.

Geändert von nuclearping (26. Dez 2013 um 02:13 Uhr)
  Mit Zitat antworten Zitat
Wulli12

Registriert seit: 25. Dez 2013
4 Beiträge
 
#6

AW: Zugriffsverletzung?

  Alt 26. Dez 2013, 02:20
Tut mir Leid, ich bin damit noch nicht so vertraut

Aber was genau ist den nun die Ursache für die 'Ungültige Zeigeroperation', ich verstehe es einfach nicht, für mich ergibt das alles Sinn, leider.^^

Ich weiß nicht einmal was mit einer Zeigeroperation gemeint ist
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Zugriffsverletzung?

  Alt 26. Dez 2013, 02:22
Teile deinen Code auf, dann wird der übersichtlicher, leichter zum Umsetzen und kommt eigentlich ohne Dokumentation aus.
Delphi-Quellcode:
type
  TDynIntArray = array of integer;

function StrToIntArray( const AStr : string; const ADelimiter : Char ) : TDynIntArray;
begin

end;

procedure SortIntArray( var AArray : TDynIntArray );
begin

end;

function IntArrayToStr( const AArray : TDynIntArray; const ADelimiter : Char ) : string;
begin

end;

function SortIntArrayStr( const AStr : string ) : string;
var
  LIntArray : TDynIntArray;
begin
  LIntArray := StrToIntArray( AValue, ',' );
  SortIntArray( LIntArray );
  Result := IntArrayToStr( LIntArray, ',' );
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.068 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zugriffsverletzung?

  Alt 26. Dez 2013, 03:07
Und für die Zukunft schalldest du in den Projektoptionen die Bereichsprüfung an
und lernst wie man den Debugger verwendet.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: Zugriffsverletzung?

  Alt 26. Dez 2013, 06:09
Ich habe in meinem Programm eine function, welche mir einen gegebenen string sortieren soll.

z.B. : '7,3,11,5,1' --> '1,3,5,7,11'

Dazu gebe ich meiner function einen string in solch einer Form, also durch Kommas abgetrennte Zahlen. Daraufhin soll es die einzelnen Zahlen separieren und in einem Array aufteilen. Daraufhin durch meinen Such-Algorithmus die einzelnen Glieder jeweils vergleichen und in ein anderes Array in geordneter Reihenfolge kopieren. Und als Ausgabe diese einfach wieder durch Kommas getrennt als einzelnen string ausgeben.
Die einfachste Möglichkeit, diese Aufgabe zu lösen, bestünde wohl darin, eine TStringList zu verwenden, mittels DelimitedText einlesen, den Delimiter auf Komma stellen und StrictDelimiter auf True. Danach setzt du das Sort-Property auf True und gibst als Result den DelimitedText aus:
Delphi-Quellcode:
Function SortiereZahlen(Eingabe : String) : String;
Var
  MyList : TSTringList;
Begin
  Result := ''; // setzt Result auf Leerstring; Fehler kannst dann daran erkennen
  MyList := TStringList.Create; // erzeugen einer Stringliste
  MyList.Delimiter := ','; // Trennzeichen = Komma
  MyList.StrictDelimiter := True; // sorgt dafür, daß nur das Komma als Trennzeichen verwendet wird

  Try
    MyList.DelimitedText := Eingabe; // hier wird dein String automatisch in einzelne Items zerlegt
    MyList.Sorted := True; // schaltet die Sortierung der Stringliste ein
    Result := MyList.DelimitedText; // weist der Rückgabe-Variablen den sortierten String zu
  Finally
    MyList.Free;
  End;
End;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Zugriffsverletzung?

  Alt 26. Dez 2013, 08:54
@Perlsau

Das Ergebnis ist dann aber '1,11,3,5,7' statt '1,3,5,7,11'
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz