Форум » [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

Dima: evgeny2006 пишет: C:\Borland\Bcc55;C:\Borland\BCC55\bin вот тут после BCC55\bin не живет один пробел ?

Dima: Вот сваял батничек для Вас rem Sborka.bat set path=C:\Borland\BCC55\bin; C:\MiniGUI\Harbour\bin\hbmk2 %1 Собирать так Sborka hello.prg

evgeny2006: Dima пишет: вот тут после BCC55\bin не живет один пробел ? Еще раз проверил. Пробелов нет. При запуске с помощью hbmk2 компиляция проходит, а вот линковка - нет. При этом, в командном окне появляются кракозябры и сообщении о наличии ошибок.

evgeny2006: Dima пишет: Собирать так Sborka hello.prg Спасибо большое!!! Завтра сразу попробую.

evgeny2006: Dima пишет: попробуйте так C:\MiniGUI\Harbour\bin\hbmk2.exe hello.prg Вторым заходом я это и делал, т.е скопировал hello.prg в папку C:\MiniGUI\Harbour\bin\ и запускал из этой папки. Вот, что получилось: C:\MiniGUI\Harbour\bin>hbmk2 hello.prg Harbour 3.2.0dev (r1405231501) Copyright (c) 1999-2014, http://harbour-project.org/ Compiling 'hello.prg'... Lines 4, Functions/Procedures 1 Generating C source output to 'C:\Users\admin\AppData\Local\Temp\hbmk_8t5pst.dir \hello.c'... Done. C:/MiniGUI/Harbour/lib/hbextern.lib: file not recognized: File format not recogn ized ♣ ld ☻♣♂♫☺ ☺ ♫♦♫♀ ☻♫☻ ☻ 1 hbmk2: Error: Running linker. 1 gcc.exe C:/Users/admin/AppData/Local/Temp/hbmk_8t5pst.dir/hello.o C:/Users/admin /AppData/Local/Temp/hbmk_8t5pst.dir/hbmk_xwajod.o -Wl,--nxcompat -Wl,--dynami cbase -mconsole -Wl,--start-group -lhbextern -lhbdebug -lhbvm -lhbrtl -lhblang - lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhb usrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lh bcplr -lhbpp -lhbcommon -lhbmainstd -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2 _32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleau t32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -Wl,--end-group -ohello .exe -LC:/MiniGUI/Harbour/lib C:\MiniGUI\Harbour\bin>

Haz: evgeny2006 пишет: gcc.exe так у вас Borland или Mingw все же ??? похоже вы пытаетесь линкеру GCC скормить либы от BCC

evgeny2006: Haz пишет: похоже вы пытаетесь линкеру GCC скормить либы от BCC Я пользуюсь BCC, но у меня есть два mingw - один для QGIS, другой для Harbour. Mingw прописан в Path. При установке я прописывал все для BCC, но несколько раз обнаруживал попытку подключить Mingw. Это у меня уже третий заход приобщиться к hbmk2. Пока тоже неудачный. Удалять Mingw из Path вроде бы жалко, но как заставить линкер (hbmk2) использовать BCC - пока не знаю. Хотя в той статье, что Вы порекомендовали - есть инструкция. Если у вас больше, чем один установленный C компилятор и хотите указать, какой именно должна использовать hbmk2, пропишите параметр -comp=<name>, где <name> - условное обозначения компилятора Сейчас попробую. Спасибо за помощь!!!

evgeny2006: Dima пишет: Вот сваял батничек для Вас rem Sborka.bat set path=C:\Borland\BCC55\bin; C:\MiniGUI\Harbour\bin\hbmk2 %1 Сделал, как Вы порекомендовали. Все отлично проходит!!! СПАСИБО!!! Главное, что нет попытки подключить линкер Mingw. Выходит, что у hbmk2 установлены разные приоритеты просмотра доступа к линкерам в зависимости от того, что раньше задано. Вероятно set path имеет более высокий приоритет.

evgeny2006: evgeny2006 пишет: Вероятно set path имеет более высокий приоритет. Абсолютно точно, что на время выполнения .bat файла в системе устанавливается новый PATH. Поэтому-то hbmk2 и выполняется правильно.

Dima: evgeny2006 я думаю правильнее в PATH совсем ни чего не прописывать в плане BCC и MINGW и просто использовать BAT (CMD) файлы с нужным PATH и тд и тп

evgeny2006: Dima пишет: я думаю правильнее в PATH совсем ни чего не прописывать в плане BCC и MINGW Согласен с Вами. Спасибо!!!

evgeny2006: Dima Что-то не могу найти, как обратиться к администратору непосредство, поэтому вынужден обратиться так. Как можно получить доступ к курилке?

Dima: evgeny2006 пишет: Как можно получить доступ к курилке? Там нет ни чего интересного. Курят там , постоянные участники и выше. Курение вред



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