Only the last dimension of an array can be changed - ReDim

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Only the last dimension of an array can be changed - ReDim

Beitrag von uweb »

Ich bin gerade dabei eine Prozedur zu schreiben um Suchmuster zu erzeugen.
Also aus "123 ABC_abs.bmp" soll z.B. "123*ABC_abs.bmp", "123*ABC*abs.bmp" oder "*ABC*.bmp", usw erzeugt werden.
Irgendwie merde ich wohl versuchen müssen die Anzahl der zur Auswahl stehenden Suchmuster zu begrenzen. Soweit bin ich aber noch nicht.

Momentan zerlege ich den String auf zwei Ebenen in ein Array. Die erste Ebene enthält die Originalteile und die zweite
enthält die Teile mit "*" aber ohne " ", "-" oder "_".

Mein aktuelles Problem ist erstaunlicherweise noch gar nicht die Logik sondern die für mich unerklärliche Fehlermeldung
"Only the last dimension of an array can be changed with ReDim.".

Code: Alles auswählen

Procedure Fuelle_Suchmuster_Auswahl(MusterDatei.s)

  Original.s = GetFilePart(MusterDatei.s)
  Original.s = Left(Original.s, Len(Original.s)-Len(GetExtensionPart(Original.s))-1)
  
  #Original=0
  #Vorbereitet=1
  
  Original_Laenge = Len(Original.s)
  Feld =1
  Dim DateiNamenTeile.s (1,Feld) 

  Zeichen.s = Left(Original.s, 1)
  If Zeichen.s <> " " And Zeichen.s <> "-" And Zeichen.s <> "_"
    DateiNamenTeile.s (#Vorbereitet,0)=""
  Else
    DateiNamenTeile.s (#Vorbereitet,0)="*"
  EndIf
  VorZeichen.s=Zeichen.s

  For i = 1 To Original_Laenge

    Zeichen.s = Mid(Original.s, i, 1)
    ZeichenASCII = Asc(Zeichen.s)
    VorZeichenASCII = Asc(VorZeichen.s)
   
    If Zeichen.s = " " Or  Zeichen.s = "-" Or Zeichen.s = "_"
      If VorZeichen.s <> " " And VorZeichen.s <> "-" And VorZeichen.s <> "_"
        DateiNamenTeile.s(#Original,Feld)=OriginalTeil.s
        DateiNamenTeile.s(#Vorbereitet,Feld)=VorbereitetTeil.s+"*"
        OriginalTeil.s=""
        VorbereitetTeil.s=" "
        Feld+1
        ReDim DateiNamenTeile.s (1,Feld)
      EndIf
      OriginalTeil.s=OriginalTeil.s+Zeichen.s

    ElseIf ZeichenASCII > 47 And ZeichenASCII < 58 
      If(VorZeichenASCII < 48 Or VorZeichenASCII > 57) ;And Len(OriginalTeil.s)
        DateiNamenTeile.s(#Original,Feld)=OriginalTeil.s
        DateiNamenTeile.s(#Vorbereitet,Feld)=VorbereitetTeil.s+"*"
        OriginalTeil.s=""
        VorbereitetTeil.s=" "
        Feld+1
        ReDim DateiNamenTeile.s (1,Feld)
      EndIf
      OriginalTeil.s=OriginalTeil.s+Zeichen.s
      VorbereitetTeil.s=VorbereitetTeil.s+Zeichen.s

    ElseIf Zeichen.s = LCase(Zeichen.s) 
      If VorZeichen.s = UCase(VorZeichen.s) And Len(OriginalTeil.s) > 1
        DateiNamenTeile.s(#Original,Feld)=OriginalTeil.s
        DateiNamenTeile.s(#Vorbereitet,Feld)=VorbereitetTeil.s+"*"
        OriginalTeil.s=""
        VorbereitetTeil.s=" "
        Feld+1
        Debug Feld
        ReDim DateiNamenTeile.s (1,Feld)
;          Dim DateiNamenTeile.s (1,Feld)
      EndIf
      OriginalTeil.s=OriginalTeil.s+Zeichen.s
      VorbereitetTeil.s=VorbereitetTeil.s+Zeichen.s

    ElseIf Zeichen.s = UCase(Zeichen.s)
      If VorZeichen.s = LCase(VorZeichen.s) And Len(OriginalTeil.s) > 1
        DateiNamenTeile.s(#Original,Feld)=OriginalTeil.s
        DateiNamenTeile.s(#Vorbereitet,Feld)=VorbereitetTeil.s+"*"
        OriginalTeil.s=""
        VorbereitetTeil.s=" "
        Feld+1
        ReDim DateiNamenTeile.s (1,Feld)
      EndIf
      OriginalTeil.s=OriginalTeil.s+Zeichen.s
      VorbereitetTeil.s=VorbereitetTeil.s+Zeichen.s

    EndIf

  Next
  
EndProcedure 

Pattern.s = "*.bmp|*.bmp;*.BMP|*.emf|*.emf;*.EMF|*.gif|*.gif;*.GIF|*.ico|*.ico;*.ICO|*.jpg|*.jpg;*.JPG|"
Pattern.s = Pattern.s +       "*.png|*.png;*.PNG|*.tga|*.tga;*.TGA|*.tif|*.tif;*.TIF|*.wmf|*.wmf;*.WMF"
MusterDatei.s = OpenFileRequester("Bitte (Muster-)Datei auswählen","c:\",Pattern.s,0,0)
; z.B. _-PlaBLA_-blaBLAbla-MeineWolken001.bmp
Fuelle_Suchmuster_Auswahl(MusterDatei.s)
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Ja, mich wundert das auch. Vorallem weil das in der PB 4.0 Beta (glaube 11 oder so) nicht so war :? Ist halt ziemlich nervig, wenn man z.B. ein Maparray neu machen will.

Evtl. kannst du mal im engl. Forum nachfragen...
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Danke für die schnelle Antwort. Ich warte lieber noch etwas bevor ich es in einer auf mein Englisch angepassten einfachen Version der Fragestellung (ohne Erklärung) probiere. Da auch die Variablennamen in deutsch sind wäre es für die Leute dort wohl schwieriger.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

die problematik ist die zuordnung der alten daten in dem array, deswegen ist das ReDim beschränkt.
das soll vermeiden, dass die schon vorhandenen daten durcheinander gewürfelt werden, wenn die anderen dimensionen geändert werden.
Redim ist halt grundsätzlich vorgesehen um ein array zu vergrößern und schon vorhandene daten zu belassen.

wenn ihr die vorhandenen daten nicht mehr braucht, was ja der fall ist wenn man alle dimensionen ändern will,
dann müsst ihr das array komplett löschen, dann könnt ihr es komplett neu dimensionieren.

Code: Alles auswählen

Dim a(5,5)
a(5,5) = 42
Debug a(5,5)
;*** Array komplett löschen
Dim a(0,0)
;***
Dim a(9,9)
a(9,9) = 42
Debug a(9,9)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Danke für die Erklärung, aber ich will ja nur die letzte Dimension redimensionieren (siehe Code - einfach ausprobieren).
Es wird ja ein paar mal Redimensioniert bevor die Meldung kommt.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> einfach ausprobieren
da fragt er mich nach einer muster-datei.
wenn ich eine auswähle oder einfach nen namen eingebe, passiert gornix.

also versteh ich dich richtig?
du bekommst diese fehlermeldung, obwohl du nur die letzte dimension redimst?
(das hättest du ja auch dazu schreiben können)

kannst du nicht vielleicht mal nen kleinen code posten, der genau diesen fehler reproduziert?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> kannst du nicht vielleicht mal nen kleinen code posten, der genau diesen fehler reproduziert?
Bei soviel wiederholungen im Code sollte es problemlos, bzw. sogar sinnvoll sein :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

passiert gornix
also bei mir kommt mit der Datei "_-PlaBLA_-blaBLAbla-MeineWolken001.bmp" (wie in der Bemerkungszeile) zumindest noch die Debugausgabe "3". Daraus schließe ich, daß ReDim schon lief.
(das hättest du ja auch dazu schreiben können)
Sorry ! Im englischen Post, den Du ja gelesen hast steht es. Außerdem dachte ich die Debugausgabe wäre Hinweis genug.

Das mit dem Reproduzieren habe ich versucht, aber nicht geschafft. Allerdings muß ich zugeben, daß ich bei Null angefangen habe. Vielleicht wäre es besser gewesen, den bestehenden Code zu kürzen. Da ich das Problem bisher nicht hatte habe ich vermute, daß der Fehler dann aber verschwinden würde. Sooo riesig ist der Code ja nun auch nicht und immerhin habe ich die Prozedur für den Post aus dem eigentlichen Programm gelöst, bereinigt, eingerückt und mit Aufruf und Bemerkungszeile versehen.

Im Moment habe ich mir das Array einfach reichlich groß dimensioniert. Meine Standard-Strategie bei Problemen die ich nicht lösen kann besteht darin Sie zu umgehen.

Es hat sich also soweit erledigt. Es wär nur eleganter gewesen es so zu lösen. In einem anderen Fall von einem für mich nicht erklärbaren Fehler bin ich schon auf einen Fehler in der Beta gestoßen. Deshalb habe ich gepostet obwohl ich das Problem umgehen konnte.

Danke trotzdem !
Antworten