AGB  ·  Datenschutz  ·  Impressum  







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

Array Zugriff

Ein Thema von Slashmob · begonnen am 27. Nov 2011 · letzter Beitrag vom 28. Nov 2011
Antwort Antwort
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#1

AW: Array Zugriff

  Alt 27. Nov 2011, 18:39
@Bjoerk: I ist nicht definiert, weil das doch der Laufindex von 0 bis 900 ist.


@MGC: Ja, also ich hab die Tabelle, die 901 Cos-Werte, die sind im Array gespeichert.

Meine konkrete Frage ist, wieso hier im letzten Teil die Berechnung nicht klappt?
Wird hier der Zugriff auf cos_Tab[i] durchgeführt?

Code:
Case quadrant of
     1: begin
          coswert:=cos_Tab[i];

        end;
     2: begin
          coswert:=-cos_Tab[1800-i];

        end;
     3: begin
          coswert:=-cos_Tab[1800+i];

        end;
     4: begin
          coswert:=cos_Tab[3600-i];

        end;
     end;

*kopfraucht*
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Array Zugriff

  Alt 27. Nov 2011, 18:42
Debuggen -> Nachkucken, was für nen Wert "i" hat.
"i" erhält nirgends nen Wert zugewiesen -> dh. da steht irgendetwas drinnen!!

Ach mein Freund, deine Tabelle geht ja von 0..900, nicht?
Wie willst du dann die folgenden Indizes ansprechen:
[1800+i], [3600-i]
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.639 Beiträge
 
Delphi 12 Athens
 
#3

AW: Array Zugriff

  Alt 27. Nov 2011, 21:20
Ersetz mal dieses

Delphi-Quellcode:
     // Quadrantnummer aus Grenzwinkeln bestimmen
     If ((winkel*10)>=0) and ((winkel*10)<=900) then
     Begin
           quadrant:= 1;
     end;
     If ((winkel*10)>900) and ((winkel*10)<=1800) then
     Begin
           quadrant:= 2;
     end;
     If ((winkel*10)>1800) and ((winkel*10)<=2700) then
     Begin
           quadrant:= 3;
     end;
     If ((winkel*10)>2700) and ((winkel*10)<=3600) then
     Begin
           quadrant:= 4;
     end;

// Funktionsberechnung

     Case quadrant of
     1: begin
          coswert:=cos_Tab[i];

        end;
     2: begin
          coswert:=-cos_Tab[1800-i];

        end;
     3: begin
          coswert:=-cos_Tab[1800+i];

        end;
     4: begin
          coswert:=cos_Tab[3600-i];

        end;
     end;
durch dieses

Delphi-Quellcode:
     
     I := winkel*10;
     // an dieser Stelle gilt: 0 <= winkel <= 360,
     // also auch: 0 <= I <= 3600
     if (I <= 900) then
       coswert := cos_Tab[I] // 0..90
     else If (I <= 1800) then
       coswert := -cos_Tab[1800 - I] // 90..180
     else If (I <= 2700) then
       coswert := -cos_Tab[I - 1800] // 180..270
     else
       coswert := cos_Tab[3600 - I]; // 270..360
Durch die Verwendung von ELSE ersparst du dir die Abfrage der unteren Grenzen. Da du vorher schon den Bereich 0..360 kontrollierst, kann diese Überprüfung ebenfalls entfallen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Array Zugriff

  Alt 27. Nov 2011, 22:07
Mein Vorschlag wäre, nur die ganzzahligen Winkel zu vertafeln und Zwischenwerte geradlinig zu interpolieren.

Delphi-Quellcode:
var
  CosTable: array [0..90] of double;

function CosFromCosTable(Alpha: integer): double;
var
  I: integer;
begin
  while Alpha < 0 do Inc(Alpha, 360);
  while Alpha > 360 do Dec(Alpha, 360);
  I:= 1;
  if Alpha > 180 then
  begin
    Dec(Alpha, 180);
    I:= -1;
  end;
  if Alpha <= 90 then
    Result:= I * CosTable[Alpha]
  else
    Result:= - I * CosTable[180 - Alpha];
end;

function SinFromCosTable(Alpha: integer): double;
begin
  Result:= CosFromCosTable(90 - Alpha);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Alpha: integer;
begin
  for Alpha:= 0 to 90 do
    CosTable[Alpha]:= Cos(Alpha * 0.0174532925199433);
end;
  Mit Zitat antworten Zitat
Benutzerbild von MGC
MGC

Registriert seit: 15. Mai 2008
Ort: Helsa
106 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Array Zugriff

  Alt 28. Nov 2011, 08:04
Ich sehe schon, es wurden bereits spitzenmäßige Ansätze übermittelt. Wobeio ich jedoch ein multidimensionales Array bevorzugen würde, wobei der Wuadrant bereits als erster Index dienen würde. Auf diese Weise kann man, meiner Meinung nach, schneller und übersichtlicher durch das Array navigieren udn seine Vergleichswerte auslesen.

Viele Grüße,
Marc
Programmieren ist wie Chemie:
1. Wenn man alles einfach nur zusammenschmeisst kommt es zu unerwarteten Reaktionen.
2. Wenn es plötzlich anfängt zu qualmen, muss man eben noch mal von vorn anfangen.
  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
 
#6

AW: Array Zugriff

  Alt 28. Nov 2011, 09:26
Ich sehe schon, es wurden bereits spitzenmäßige Ansätze übermittelt. Wobeio ich jedoch ein multidimensionales Array bevorzugen würde, wobei der Wuadrant bereits als erster Index dienen würde. Auf diese Weise kann man, meiner Meinung nach, schneller und übersichtlicher durch das Array navigieren udn seine Vergleichswerte auslesen.

Viele Grüße,
Ähmmm, das Salz in der Suppe bei diesem Ansatz ist es doch, dass nur die Werte für den ersten Quadranten berechnet und abgespeichert werden.
Alle Werte für die Quadranten 2-4 werden aufgrund der Werte vom Quadranten 1 ermittelt, die sich ja auch lediglich durch ein Vorzeichen, bzw. die Reihenfolge unterscheiden.
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
Slashmob

Registriert seit: 28. Okt 2011
45 Beiträge
 
#7

AW: Array Zugriff

  Alt 28. Nov 2011, 14:20
Ich sehe schon, es wurden bereits spitzenmäßige Ansätze übermittelt. Wobeio ich jedoch ein multidimensionales Array bevorzugen würde, wobei der Wuadrant bereits als erster Index dienen würde. Auf diese Weise kann man, meiner Meinung nach, schneller und übersichtlicher durch das Array navigieren udn seine Vergleichswerte auslesen.

Viele Grüße,
Ähmmm, das Salz in der Suppe bei diesem Ansatz ist es doch, dass nur die Werte für den ersten Quadranten berechnet und abgespeichert werden.
Alle Werte für die Quadranten 2-4 werden aufgrund der Werte vom Quadranten 1 ermittelt, die sich ja auch lediglich durch ein Vorzeichen, bzw. die Reihenfolge unterscheiden.
Richtig!

@all: Hab jetzt mein Problem mit euren Ansätzen lösen können. Funktioniert alles wunderbar!
Vielen Dank euch allen!
  Mit Zitat antworten Zitat
Benutzerbild von MGC
MGC

Registriert seit: 15. Mai 2008
Ort: Helsa
106 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Array Zugriff

  Alt 28. Nov 2011, 21:00
Ähmmm, das Salz in der Suppe bei diesem Ansatz ist es doch, dass nur die Werte für den ersten Quadranten berechnet und abgespeichert werden.
Alle Werte für die Quadranten 2-4 werden aufgrund der Werte vom Quadranten 1 ermittelt, die sich ja auch lediglich durch ein Vorzeichen, bzw. die Reihenfolge unterscheiden.
Zitat:
Ziel ist es alleine durch die obige Cos-Tabelle (0°-90°) die Werte von Sinus, Cosinus und Tangens im Bereich von 0° bis 360° zu "berechnen", indem man die richtigen Verhältnisse von Cos aus dem ersten Quadranten zu den übrigen Quadranten erstellt.
@Sir Rufo:

Uups... da habe ich mal wieder bewiesen, dass ich 1.) nicht aufmerksam genug gelesen habe und 2.) erneut vorgeführt, dass ich eine mathematische Niete bin.

Was mir aber wirklich unheimlich wird, warum erwischst ausgerechnet immer Du mich dabei?
Marc
Programmieren ist wie Chemie:
1. Wenn man alles einfach nur zusammenschmeisst kommt es zu unerwarteten Reaktionen.
2. Wenn es plötzlich anfängt zu qualmen, muss man eben noch mal von vorn anfangen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz