Форум » [x]Harbour » Как программно создать двумерный массив » Ответить

Как программно создать двумерный массив

evgeny2006: Вопрос к знатокам! Что-то не догоняю в программном создании двумерного массива. Сталкиваюсь с этим уже не первый раз. Вот пример: [more] local m_spisok:={} public aRoute := {} m:=4 n:=4 // создаем одномерный массив из m элементов for i=1 to m aadd(m_spisok,0) next msgdebug ('m_spisok=',m_spisok) // Создаем двумерный массив из n строк for i=1 to n aadd(aRoute,m_spisok) next msgdebug ('aRoute=',aRoute)[/more] Получаю какую-то абракадабру. Кстати с арабского это означает:"Лечу (от слова лечить) я, лечу". Что я делаю не так? Есть у меня сомнение в правильности вывода на экран msgdebug.

Ответов - 33, стр: 1 2 All

Haz: evgeny2006 пишет: Есть у меня сомнение в правильности вывода на экран msgdebug. аналогично массив создается правильно, можно вывести на экран как for n=1 to Len( aRoute ) msgdebug ('aRoute['+ntoc(n)+']=',aRoute[n]) next Видимо msgdebug не дружит с многомерными массивами, можно под них написать свою гляделку

Dima: evgeny2006 пишет: for i=1 to n aadd(aRoute,m_spisok) next После такой операции будет получен массив { {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0} }

evgeny2006: Dima пишет: После такой операции будет получен массив { {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0} } Мне это и нужно! Только msgdebug выдает другие результаты. Значит нужно осмотрительно относиться к выводу многомерных массивов. Спасибо! Haz пишет: Видимо msgdebug не дружит с многомерными массивами, можно под них написать свою гляделку Спасибо за подсказку!


Dima: evgeny2006 пишет: msgdebug ('aRoute=',aRoute) Вот так попробуй msgdebug ('aRoute=',hb_ValToExp(aRoute)) ЗЫ Сделал вот такой тестик. a:={{1,2,3,4},{1,333,"333"}} ? hb_ValToExp(a) // выдает {{1, 2, 3, 4}, {1, 333, "333"}}

Pasha: Вместо for i=1 to n aadd(aRoute,m_spisok) next лучше делать так: for i=1 to n aadd(aRoute, ACLONE(m_spisok)) next иначе все элементы массива будут содержать один и тот же m_spisok, что приведет к неприятному сюрпризу: при изменении одного элемента изменятся сразу все.

SergKis: evgeny2006 пишет:Только msgdebug выдает другие результаты Это очень странно ? MsgDebug использует hb_ValToExp(...) : [pre2] FUNCTION MsgDebug( ... ) *-----------------------------------------------------------------------------* LOCAL i, cMsg, nCnt := PCount() cMsg := "Called from: " + ProcName( 1 ) + "(" + hb_ntos( ProcLine( 1 ) ) + ") --> " + ProcFile( 1 ) + CRLF + CRLF FOR i = 1 TO nCnt cMsg += hb_ValToExp( PValue( i ) ) + iif( i < nCnt, ", ", "" ) NEXT MsgInfo( cMsg, "DEBUG INFO" ) RETURN cMsg [/pre2]

Dima: Да вроде все верно работает. Пример: [pre2] proc main local amas:={{1,2,3,4}} ? MsgDebug(amas) /// {{1, 2, 3, 4}} FUNCTION MsgDebug( ... ) *-----------------------------------------------------------------------------* #define CRLF CHR(13)+CHR(10) LOCAL i, cMsg, nCnt := PCount() cMsg := "Called from: " + ProcName( 1 ) + "(" + hb_ntos( ProcLine( 1 ) ) + ") --> " + ProcFile( 1 ) + CRLF + CRLF FOR i = 1 TO nCnt cMsg += hb_ValToExp( PValue( i ) ) + iif( i < nCnt, ", ", "" ) NEXT *MsgInfo( cMsg, "DEBUG INFO" ) RETURN cMsg [/pre2]

Andrey: Dima пишет: Да вроде все верно работает. Глючит зараза... LOCAL aObj3But .... присвоение и вычисление.... aObj3But := { ; {"oBut_CExit" ,nRow1,nCol1,nLenButt,nHButt,"[Esc];Выход","iExit48x1" ,"iExit48x2" ,nFontSize,aFontColor,COLOR_RED_METRO , NIL ,'' ,.T.,.F. }, ; {"oBut_CSave" ,nRow1,nCol2,nLenButt,nHButt,"Сохранить;и выйти","iSave48x1","iSave48x2",nFontSize,aFontColor,COLOR_BRIGHT_GREEN, NIL ,'Сохранить карточку и выйти' ,.T.,.F. }, ; {"oBut_CPrint",nRow1,nCol3,nLenButt,nHButt,"[F5];Печать","iPrint48x1" ,"iPrint48x2" ,nFontSize,aFontColor,COLOR_DARK_GREY , NIL ,'Печать карточки' ,.T.,.F. }, ; {"oBut_CTab" ,nRow1,nCol7,nLenBut2,nHButt,"[Tab];Следующая карточка",NIL ,NIL ,nFontSize,BLUE ,COLOR_LIGHT_BLUE , NIL ,'Перейти на следующую запись' ,.T.,.F. }, ; {"oBut_CShTab",nRow1,nCol8,nLenBut2,nHButt,"[Shift+Tab];Предыдущая карточка",NIL ,NIL,nFontSize,BLUE ,COLOR_LIGHT_BLUE , NIL ,'Перейти на предыдущую запись',.T.,.F. } ; } // проверка массива сразу ! MsgDebug("Проверка:",aObj3But) Результат: И как это понимать ?

SergKis: Andrey пишет:И как это понимать ? Понимать надо так - где то у тебя пропущен разделитель и выполнение функции пошло по др. ветке (см. ..\rtl\valtoexp.prg line > 160): [pre2] FUNCTION hb_ValToExp( xVal, lRaw ) hb_default( @lRaw, .F. ) RETURN s_valToExp( xVal, lRaw ) STATIC FUNCTION s_valToExp( xVal, lRaw, cInd, hRefs, cRefs, cObjs ) ... [/pre2]

Andrey: SergKis пишет: Понимать надо так - где то у тебя пропущен разделитель и выполнение функции пошло по др. ветке Я взял пример из Menu2.prg !

SergKis: Andrey пишет:Я взял пример из Menu2.prg ! Попробовал. Результат такой же, а вот так - все ok! : cOut := '' AEVAL(aObjButton, {|aE,nE| cOut += hb_ntos(nE)+'. '+hb_valtoexp(aE)+CRLF }) ? cOut надо смотреть почему hb_valtoexp(...) лезет в (line 161) : ...[pre2] IF cInd == "" IF ! Empty( cRefs ) cVal := "__itemSetRef( " + cVal + ", {" + cRefs + "} )" ENDIF [/pre2]

evgeny2006: Pasha пишет: что приведет к неприятному сюрпризу: при изменении одного элемента изменятся сразу все. Спасибо большое!!! Именно это у меня произошло! Башку сломал! Даже хотел создать новую тему и изложить то, что у меня произошло. У меня были 2 программки на Фортране и Питоне для решения транспортой задачи. Задумал я эту программу перевести на Харбор. В результате столкнулся с вышеизложенными проблемами. Пришлось отказаться от динамического построения двумерных массивов, а использовать массивы с заранее фиксированными границами. Все прошло безукоризненно. Еще раз большое спасибо!!!

evgeny2006: Dima пишет: Пример: proc main local amas:={{1,2,3,4}} ? MsgDebug(amas) /// {{1, 2, 3, 4}} Не подскажите, как компилировать, линковать и исполнять подобные программы? Я этого не знаю. И куда посмотреть? Дело в том, что прежде чем что-то делать, иногда надо проверить, как работает команда. Без этого инструмента я и напоролся на якобы неправильно работающую функцию directory().

evgeny2006: Может быть не совсем по теме, но все-таки имеющей к ней отношение. Есть ли примеры, кроме minigraph, для построения графиков функции. И где можно посмотреть или поискать.

Dima: evgeny2006 пишет: Не подскажите, как компилировать, линковать и исполнять подобные программы? Если мы говорим о простых консольных примерах (тестах) то собирается очень просто. Пример для BCC , пути к нему у меня прописаны в переменной PATH [pre2] Proc main // test.prg ? "Hello word" wait return [/pre2] Сборка c:\hb32\bin\hbmk2 test.prg Где c:\hb32 путь к Harbour

evgeny2006: Dima пишет: Если мы говорим о простых консольных примерах (тестах) то собирается очень просто. Спасибо!!! А как собрать без использования hbmk2? Он у меня не хочет работать.

evgeny2006: Dima пишет: Пример для BCC , пути к нему у меня прописаны в переменной PATH Если можно, покажите полные пути к BCC55

Dima: Батник вот тут http://www.kresin.ru/hrbfaq.html#Compile evgeny2006 пишет: Если можно, покажите полные пути к BCC55 у меня так Path=c:\bcc55\bin; Dima пишет: у меня так Path=c:\bcc55\bin; некоторые делают ошибку и добавляют случайно лишний пробел в пути [pre2]Path=c:\bcc55\bin [/pre2] По этой причине кстати может не работать HBMK2 , так как не найдет компилятор.

evgeny2006: Dima пишет: Path=c:\bcc55\bin Не знаю на что и грешить. У меня путь прописан следующим образом: C:\Borland\Bcc55;C:\Borland\BCC55\bin Первая часть пути - так на всякий случай. Даже поместил hello.prg в C:\minigui\harbour\bin, но линковка не проходит. Честно говоря, у меня появилось сомнение - а был ли hbmk2.bat у меня при установке minigui. Или я его скопировал и установил дополнительно. При установке minigui я использовал HarbourMiniGUIExtEd-2.3.6-Setup

Dima: evgeny2006 пишет: Честно говоря, у меня появилось сомнение - а был ли hbmk2.bat у меня при установке minigui. я писал не про него а про C:\MiniGUI\Harbour\bin\hbmk2.exe попробуйте так C:\MiniGUI\Harbour\bin\hbmk2.exe hello.prg



полная версия страницы