BlitzArrays and strings?

Blitz3D Forums/Blitz3D Beginners Area/BlitzArrays and strings?

_PJ_(Posted 2010) [#1]
Maybe I've done something stupid elsewhere, admittedly, my head's spinning a bit from this right ow, but in a little program I'm having trouble with a Blitz Array.
Ideally, it shoiuld store a string value, but the compielr claims a variable type mismatch.

here's the full code. The compiler breaks in the GetTableNameByReference function at the first line where ffpDataFile$=affpDataFiles[]

	Const DATA_TYPE_INVALID=0
	Const DATA_TYPE_INTEGER=1
	Const DATA_TYPE_FLOAT=2
	Const DATA_TYPE_STRING=4
	
	Global fnConfigFile$="Config.ini"
	Global dRoot$
	Global dData$
	Global affpDataFiles$[256]					;Hard limit imposed, Array Size must be constant.
	
	Initialise
	
	Global nRaces_Number
	Global nProfessions_Number
	Global nAbilities_Number
	
	Type DATATABLE
		Field sDataTable_Friendlyame$
		Field nDatatable_ColumnCount%
		Field anTableColumn_Columns[32]
	End Type
	
	Type TABLECOLUMN
		Field tTableColumn_Datatable.DATATABLE
		Field nTableColumn_ReferenceNumber%
		Field sTableColumn_Title$
		Field nTableColumn_DataType%
		Field tTableColumn_RowData.TABLEROWDATA
	End Type
	
	Type TABLEROWDATA
		Field tTableRowData_Datatable.DATATABLE
		Field nTableRowData_ReferenceNumber%
		Field TableRowData_DataColumn.TABLECOLUMN
		Field nTableColumn_DataType
		Field nTableRowData_Int%
		Field fTableRowData_Float#
		Field sTableRowData_String%
	End Type
	
Function nGetDataTypeOfDataTableColumnHandle%(hTableColumn)
	Local GetColumn.TABLECOLUMN = Object.TABLECOLUMN(hTableColumn)
	If (GetColumn.TABLECOLUMN=Null) Then Return DATA_TYPE_INVALID
	Return GetColumn\nTableColumn_DataType
End Function

Function hGetColumnOfReferenceFromDataTableHandle%(hDataTable,nColumnReference%)
	Local GetTable.DATATABLE = Object.DATATABLE(hDataTable)
	If (GetTable.DATATABLE=Null) Then Return -1
	Local nCount%=GetTable\nDatatable_ColumnCount%
	If (Not(nCount%))
		DebugLog "Table Column reference out of range"
		Return -1
	End If
	Return GetTable\anTableColumn_Columns[nColumnReference%]
End Function

Function hGetTableHandleFromName(sFriendlyName$)
	Local GetTable.DATATABLE
	For GetTable.DATATABLE=Each DATATABLE
		If (GetTable.DATATABLE<>Null)
			If (GetTable\sDataTable_Friendlyame=sFriendlyName) Then Return Handle(GetTable.DATATABLE)
		End If
		
	Next
	Return False
End Function


Function bfGetFlagFromReference%(nReference%)
	Return (1 Shl (nReference))
End Function

Function nGetReferenceFromFlag%(nFlag)
	Return ((nFlag-1) ^ 0.5)
End Function

Function AddDataTableNameToConfigurations(sDataTableName$)
	If ((sDataTableName$)<>"")
		Local hFile=OpenFile(fnConfigFile)
		If (Not(hFile)) Then RuntimeError "No Configurations"
		SeekFile(hFile,Eof(hFile))
		WriteLine(hFile,sDataTableName$)
		CloseFile(hFile)
		RefreshTableDatafileReferences
	End If
End Function

Function ClearAllTableData()
	Delete Each DATATABLE
	Delete Each TABLECOLUMN
	Delete Each TABLEROWDATA
	DebugLog "Cleared All table data"
End Function

Function GetTableNameByReference$(nReference%)	
	Local ffpDataFile$=Str(affpDataFiles$[nReference%-1])
	If (Not(FileType(ffpDataFile$)=1))
		DebugLog "File not found "+Chr(34)+ffpDataFile$+Chr(34)
	Else
		Local hFile=ReadFile(ffpDataFile$)
		If (Not(hFile))
			If (Not(FileType(ffpDataFile)=1))
				DebugLog "Out of data "+Chr(34)+ffpDataFile$+Chr(34)
			Else
				Local sFriendlyName$=Left(Right(ffpDataFile$,Len(ffpDataFile)-(Len(dData$))),Len(Right(ffpDataFile$,Len(ffpDataFile)-(Len(dData$))))-4)
				Return sFriendlyName$
			End If
		End If
	End If
	Return ""
End Function

Function GetTableReferenceByName%(sFriendlyName$)
	sFriendlyName$=Upper(sFriendlyName)
	Local nIterDataFiles%
	Local ffpDataFiles$
	For nIterDataFiles%=1 To 256
		ffpDataFiles=Upper(Left(affpDataFiles$[nIterDataFiles-1],Len(affpDataFiles$[nIterDataFiles-1])-Len(dData)),(Len(Right(affpDataFiles$[nIterDataFiles],Len(affpDataFiles$[nIterDataFiles-1])-Len(dData))))-4)
		If(ffpDataFiles$)=(sFriendlyName$)
			If (FileType(affpDataFiles$[nIterDataFiles%-1])=1) Then Return nIterDataFiles%
			DebugLog "DataFile Not found "+Chr(34)+affpDataFiles$[nIterDataFiles%-1]+Chr(34)
			Return False
		End If	
	Next
	DebugLog "DataFile Not found "+Chr(34)+sFriendlyName+Chr(34)
	Return False
End Function

Function RefreshTableDatafileReferences()
	Local nIterReferences%
	For nIterReferences%=0 To 255
		affpDataFiles$[nIterReferences%]=""
	Next
	Local hFile=ReadFile(fnConfigFile)
	Local sLine$=ReadLine(hFile)
	dRoot=dFixDirPath(sLine)
	sLine$=ReadLine(hFile)
	dData=dFixDirPath(sLine)
	Local nCount%
	sLine$=ReadLine(hFile)
	While ((Not(Eof(hFile))) And (sLine<>""))
		nCount%=nCount%+1
		affpDataFiles$[nCount%-1]=dData$+sLine$+".dat"
		sLine$=ReadLine(hFile)
	Wend
	CloseFile hFile
	DebugLog "Datafile references refreshed"
End Function

Function Initialise()
	If (Not(FileType(fnConfigFile$)=1))
		DebugLog "No Configuration File Exists. Maybe First Run"
		WriteConfigs
	End If	
	RefreshTableDatafileReferences
End Function

Function WriteConfigs()
	Local hFile=WriteFile(fnConfigFile$)
	WriteLine(hFile,SystemProperty("appdir"))
	WriteLine(hFile,"Data\")
	Local hDataDir=ReadDir(SystemProperty("appdir")+"Data\")
	Local fnGetDataFile$=NextFile(hDataDir)
	While(fnGetDataFile$)<>""
		If (FileType(fnGetDataFile$)=1)
			fnGetDataFile=Left(fnGetDataFile$,Len(fnGetDataFile)-4)
			WriteLine(hFile,fnGetDataFile)
			fnGetDataFile$=NextFile(hDataDir)
		End If
	Wend
	CloseDir hDataDir
	CloseFile hFile
End Function

Function dFixDirPath$(dPath$)
	If (dPath$<>"")
		If (Right(dPath$,1)<>"\") Then dPath$=dPath$+"\"
	End If
	Return dPath$
End Function




Charrua(Posted 2010) [#2]
hi, str isn't necesary , str spects a number not a string

there are no need to convert a string to a string!

Juan


puki(Posted 2010) [#3]
Is it because you are loading a string via Str which should take a numeric variable and shunt it to a string - but the variable you are shunting is a string in the first place?

Local ffpDataFile$=Str(affpDataFiles$[nReference%-1])

ie, you have to break that sucker up a bit before shunting it.


EDIT:
Beaten to it - sniff.


_PJ_(Posted 2010) [#4]
Oh no, sorry - the Str() was what I put in just in case after it refused to compile initially.

That's not the problem, though at least I appreciate the fact it wasobviously NOT a good way to try and solve the issue :)


Warner(Posted 2010) [#5]
You should omit the $-sign after the BlitzArray name when using it.
It should only be used when the BlitzArray is defined:
Global test$[3]

test[1] = "Hello" ;good
test$[1] = "Hello" ;bad..



Charrua(Posted 2010) [#6]
if you write the sentence pointed with out the "$" and str() function, another malicious appear:
ffpDataFiles=Upper(Left(affpDataFiles$[nIterDataFiles-1],Len(affpDataFiles$[nIterDataFiles-1])-Len(dData)),(Len(Right(affpDataFiles$[nIterDataFiles],Len(affpDataFiles$[nIterDataFiles-1])-Len(dData))))-4)

again, omit the "$"
split it in some parts, you will see that this sentence is incorrect, Too Many parameters. Upper only needs a string, you have so many things separated by ","

juan


_PJ_(Posted 2010) [#7]
@Charrua :
thanks, I think I was overzealous in putting that all on one line.
		ffpDataFile=Upper(Right$(ffpDataFile$,Len(ffpDataFile$)-Len(dData$)))
		ffpDataFile=Left(ffpDataFile$,Len(ffpDataFile$)-4)

This neater version does the trick :)

@Warner:

Well spotted. That seemed to be the main cause of the trouble. I removed the $ except for the declaration line and t works :)
Thank you all!