En fait, je commence mon tableau à 0,0 , si il faisait 1024x1024, ça ferait pas mal de mémoire perdue pour rien (1 Mo) et comme je n'ai de 2Go, je ne veux pas gâcher. Pour revenir à mon problème, je ne connais pas du tout la taille de mon tableau au départ. D’ailleurs je poste mon code qui n'est pas encore terminé
Code : Tout sélectionner
Enumeration
#Fichier
#Droite
#Gauche
#Haut
#Bas
#DiagonaleDN ; descendante normale
#DiagonaleMN ; montante normale
#DiagonaleDI ; descendante inversée
#DiagonaleMI ; descendante inversée
EndEnumeration
Global NomFich$, LongFich.i, *IDMem.i, *AdrFich.String, Fich$, NbrLigFich.i, LongLigFich.i, Lig, Lig$, Col.i, Dir$, Rech1.i, Rech2.i
Global D.i, XD.i, XA.i, YD.i, YA.i, L.i, PosLig.i, PosCol.i, ChaineATrouver$, ChaineTrouvee$,Caractere$, X.i, Y.i, NonTrouve.b = 0
Declare Afficher()
Procedure ChercheChaineDoubleDim(ChaineATrouver.s)
ChaineATrouver$ = ChaineATrouver
NomFich$ = OpenFileRequester("Veuillez sélectionner un fichier", "", "Fichiers Textes | *.txt", 0)
If NomFich$
If ReadFile(#Fichier, NomFich$)
LongFich = Lof(#Fichier)
*IDMem = AllocateMemory(LongFich)
If *IDMem
ReadData(#Fichier, *IDMem, LongFich)
*AdrFich.String = @*IDMem
Fich$ = *AdrFich\s
If Fich$ <> ""
NbrLigFich = CountString(Fich$, #CRLF$)
LongLigFich = Len(StringField(Fich$, 1, #CRLF$))
L = Len(ChaineATrouver$)
Global Dim Tableau1.s(LongLigFich-1, NbrLigFich-1) ;- Tableau horizontal
Global Dim Tableau2.s(LongLigFich-1, NbrLigFich-1) ;- Tableau vertical
CloseFile(#Fichier)
Else
MessageRequester("Attention", "Le fichier "+NomFich$+" n'a pas pu être chargé !", #MB_ICONEXCLAMATION)
EndIf
Else
MessageRequester("Erreur", "Impossible d'allouer "+Str(LongFich)+" octets !", #MB_ICONERROR)
EndIf
EndIf
EndIf
;- création du tableau1
For Lig = 1 To NbrLigFich
ChaineTrouvee$ = StringField(Fich$, Lig, #LF$)
For Col = 1 To LongLigFich
Caractere$ = Mid(ChaineTrouvee$, Col,1)
Tableau1(Col-1, Lig-1) = Caractere$
Next Col
Next Lig
;- lecture du tableau1
For Lig = 1 To NbrLigFich
ChaineTrouvee$ = ""
For Col = 1 To LongLigFich
ChaineTrouvee$ + Tableau1(Col-1, Lig-1)
Next Col
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ChaineTrouvee$, ReverseString(ChaineATrouver$))
If Rech1 ;- gauche à droite
If Mid(ChaineTrouvee$, FindString(ChaineTrouvee$,ChaineATrouver$), Len(ChaineATrouver$)) = ChaineATrouver$
D = #Droite
XD = Rech1
YD = Lig
Afficher()
Break
EndIf
ElseIf Rech2 ;- droite à gauche
ChaineTrouvee$ = ReverseString(ReverseString(ChaineATrouver$))
If ChaineTrouvee$ = ChaineATrouver$
D = #Gauche
XD = Rech2 ;+ L -1
YD = Lig
Afficher()
Break
EndIf
Else
;- création du tableau2
For PosLig = 1 To NbrLigFich
For PosCol = 1 To LongLigFich
Tableau2(PosLig-1, PosCol-1) + Mid(Tableau1(PosCol-1, PosLig-1), Lig, 1)
ChaineTrouvee$ = Tableau2(Lig-1, PosCol-1)
Next PosCol
Next PosLig
;- lecture du tableau2
For Col = 1 To LongLigFich
ChaineTrouvee$ + Tableau2(Col-1, Lig-1)
Next Col
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ChaineTrouvee$, ReverseString(ChaineATrouver$))
If Rech1 ;- haut en bas
If Mid(ChaineTrouvee$, FindString(ChaineTrouvee$,ChaineATrouver$), Len(ChaineATrouver$)) = ChaineATrouver$
D = #Haut
XD = Lig
YD = Rech1 -1
Afficher()
Break
EndIf
ElseIf Rech2 ;- bas en haut
ChaineTrouvee$ = ReverseString(ReverseString(ChaineATrouver$))
If ChaineTrouvee$ = ChaineATrouver$
D = #Bas
XD = Lig
YA =Rech2 -1
Afficher()
Break
EndIf
EndIf ; vertical
EndIf ; horizontal
Next Lig
;- diagonales normales
Rech1 = 0
Rech2 = 0
X = 0 : Y = 0
If Y = 0
ChaineTrouvee$ = Tableau1(X, Y) ; haut gauche
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DMN
ElseIf Rech2
Goto DDI
EndIf
ChaineTrouvee$ = Tableau1(X+5, Y+5) ; bas droite
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DMN
ElseIf Rech2
Goto DDI
EndIf
EndIf
Y + 1
If Y = 1
ChaineTrouvee$ = Tableau1(X, Y) + Tableau1(X+1, Y-1) ; deuxième ligne, première colonne
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DMN
ElseIf Rech2
Goto DDI
EndIf
ChaineTrouvee$ = Tableau1(X+4, Y+4) + Tableau1(X+5, Y+3) ; avant dernière colonne, avant dernière ligne
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DMN
ElseIf Rech2
Goto DDI
EndIf
EndIf
Y + 1
If Y = 2
ChaineTrouvee$ = Tableau1(X, Y) + Tableau1(X+1, Y-1) + Tableau1(X+2, Y-2)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DMN
ElseIf Rech2
Goto DDI
EndIf
ChaineTrouvee$ = Tableau1(X+3, Y+3) + Tableau1(X+4, Y+2) + Tableau1(X+5, Y+1)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DMN
ElseIf Rech2
Goto DDI
EndIf
EndIf
Y + 1
If Y = 3
ChaineTrouvee$ = Tableau1(X, Y) + Tableau1(X+1, Y-1) + Tableau1(X+2, Y-2) + Tableau1(X+3, Y-3)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DMN
ElseIf Rech2
Goto DDI
EndIf
ChaineTrouvee$ = Tableau1(X+2, Y+2) + Tableau1(X+3, Y+1) + Tableau1(X+4, Y) + Tableau1(X+5, Y-1)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DMN
ElseIf Rech2
Goto DDI
EndIf
EndIf
Y + 1
If Y = 4
ChaineTrouvee$ = Tableau1(X, Y) + Tableau1(X+1, Y-1) + Tableau1(X+2, Y-2) + Tableau1(X+3, Y-3) + Tableau1(X+4, Y-4)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DMN
ElseIf Rech2
Goto DDI
EndIf
ChaineTrouvee$ = Tableau1(X+1, Y+1) +Tableau1(X+2, Y) + Tableau1(X+3, Y-1) + Tableau1(X+4, Y-2) + Tableau1(X+5, Y-3)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DMN
ElseIf Rech2
Goto DDI
EndIf
EndIf
Y + 1
If Y = 5
ChaineTrouvee$ = Tableau1(X, Y) + Tableau1(X+1, Y-1) +Tableau1(X+2, Y-2) + Tableau1(X+3, Y-3) + Tableau1(X+4, Y-4) + Tableau1(X+5, Y-5)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DMN
ElseIf Rech2
Goto DDI
EndIf
EndIf
;-diagonale montante normale
DMN:
If Mid(ChaineTrouvee$, FindString(ChaineTrouvee$, ChaineATrouver$), Len(ChaineATrouver$)) = ChaineATrouver$
D = #DiagonaleMN
XD =Rech1
YD = X
XA = XD + L -1
YA = YD - L +1
Afficher()
Else
NonTrouve = 1
EndIf
;-diagonale descendante inversée
DDI:
If Mid(ReverseString(ChaineTrouvee$), FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$), Len(ChaineATrouver$)) = ChaineATrouver$
D = #DiagonaleDI
YD = Rech2
XD = L
XA = XD - L +1
YA = X - L +1
Afficher()
Else
NonTrouve = 1
EndIf
;-diagonales inversées
Rech1 = 0
Rech2 = 0
X = 1
If X = 1
ChaineTrouvee$ = Tableau2(5, 0)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DDN
ElseIf Rech2
Goto DMI
EndIf
ChaineTrouvee$ = Tableau2(0, 5)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DDN
ElseIf Rech2
Goto DMI
EndIf
EndIf
X + 1
If X = 2
ChaineTrouvee$ = Tableau2(4, 0) + Tableau2(5, 1)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DDN
ElseIf Rech2
Goto DMI
EndIf
ChaineTrouvee$ = Tableau2(0, 4) + Tableau2(1, 5)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DDN
ElseIf Rech2
Goto DMI
EndIf
EndIf
X + 1
If X = 3
ChaineTrouvee$ = Tableau2(3, 0) + Tableau2(4, 1) + Tableau2(5, 2)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DDN
ElseIf Rech2
Goto DMI
EndIf
ChaineTrouvee$ = Tableau2(0, 3) + Tableau2(1, 4) + Tableau2(2, 5)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DDN
ElseIf Rech2
Goto DMI
EndIf
EndIf
X + 1
If X = 4
ChaineTrouvee$ = Tableau2(2, 0) + Tableau2(3, 1) + Tableau2(4, 2) + Tableau2(5, 3)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DDN
ElseIf Rech2
Goto DMI
EndIf
ChaineTrouvee$ = Tableau2(0, 2) + Tableau2(1, 3) + Tableau2(2, 4) + Tableau2(3, 5)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DDN
ElseIf Rech2
Goto DMI
EndIf
EndIf
X + 1
If X = 5
ChaineTrouvee$ = Tableau2(1, 0) + Tableau2(2, 1) + Tableau2(3, 2) + Tableau2(4, 3) + Tableau2(5,4)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DDN
ElseIf Rech2
Goto DMI
EndIf
ChaineTrouvee$ = Tableau2(0, 1) +Tableau2(1, 2) + Tableau2(2, 3) + Tableau2(3, 4) + Tableau2(4, 5)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DDN
ElseIf Rech2
Goto DMI
EndIf
EndIf
X + 1
If X = 6
ChaineTrouvee$ = Tableau2(0, 0) + Tableau2(1, 1) +Tableau2(2, 2) + Tableau2(3,3) + Tableau2(4,4) + Tableau2(5, 5)
Rech1 = FindString(ChaineTrouvee$, ChaineATrouver$)
Rech2 = FindString(ReverseString(ChaineTrouvee$), ChaineATrouver$)
If Rech1
Goto DDN
ElseIf Rech2
Goto DMI
EndIf
EndIf
End
;- diagonale montante inversée
DMI:
If Mid(ChaineTrouvee$, FindString(ChaineTrouvee$, ChaineATrouver$), Len(ChaineATrouver$)) = ChaineATrouver$
D = #DiagonaleMI
XD = Rech2
YD = LongLigFich+L-1
Afficher()
Else
NonTrouve = 1
EndIf
;- diagonale descendante normale
DDN:
If Mid(ChaineTrouvee$, FindString(ChaineTrouvee$, ChaineATrouver$), Len(ChaineATrouver$)) = ChaineATrouver$
D = #DiagonaleDN
XD = Rech1
YD = L
Afficher()
EndIf
End
;CallDebugger
EndProcedure
Procedure Afficher()
Select D
Case #Droite
Dir$ = "de gauche à droite"
Case #Gauche
Dir$ = "de droite à gauche"
Case #Haut
Dir$ = "de haut en bas"
Case #Bas
Dir$ = "de bas en haut"
Case #DiagonaleDN
Dir$ = "diagonale descendante normale"
Case #DiagonaleMN
Dir$ = "diagonale montante normale"
Case #DiagonaleDI
Dir$ = "diagonale desendante inversée"
Case #DiagonaleMI
Dir$ = "diagonale montante inversée"
EndSelect
MessageRequester("Résultats", "Direction de recherche : "+Dir$+#CRLF$+"Position X : "+Str(XD)+#CRLF$+"Position Y : "+Str(YD)+#CRLF$+"Longueur de la chaine : "+Str(L)+#CRLF$+"Chaîne à trouver : "+ChaineATrouver$,#MB_ICONINFORMATION)
EndProcedure
Il ne me reste plus que les diagonales et se sera parfait. Merci à tous pour votre contribution généreuse.