RobertLM78 Posted June 20, 2014 Share Posted June 20, 2014 (edited) Hey there 99ers, I hate to do ask for help, but I'm stuck. I've been working on this program for the better part of the day, and going to test it, I'm running into all sorts of trouble. 160 !********************** 170 OPTION BASE 1 :: DIM V(3,15),V$(3),SM(15),CP(3):: ON WARNING NEXT 180 FOR R=1 TO 3 :: FOR C=1 TO 15 :: V(R,C)=0 :: NEXT C :: NEXT R 190 FOR C=1 TO 15 :: SM(C)=0 :: NEXT C :: FOR C=1 TO 3 :: CP(C)=0 :: NEXT C 200 !****************** 210 !** SET DISPLAY ** 220 !****************** 230 CALL CLEAR :: CALL SCREEN(5) 240 FOR CS=0 TO 12 :: CALL COLOR(CS,16,2):: NEXT CS 250 U$="0000FFFF00000000" :: CALL CHAR(128,U$):: CALL COLOR(13,11,2) 260 FOR I=1 TO 3 :: V$(I)="VECTOR"&STR$(I):: NEXT I 270 DISPLAY AT(1,:"VECTOR MATH 1.0" :: CALL HCHAR(2,9,128,17) 280 DISPLAY AT(4,1):"VECTOR MATH DOES VECTOR" 290 DISPLAY AT(5,1):"OPERATIONS ON UP TO 3" 300 DISPLAY AT(6,1):"VECTORS IN UP TO 15-" 310 DISPLAY AT(7,1):"DIMENSIONAL SPACE." 320 DISPLAY AT(9,1):"(WHERE APPLICABLE )." 330 CALL KEY(0,K,S):: IF S=0 THEN 330 340 CALL CLR :: CALL HCHAR(2,1,128,32) 350 !***************** 360 !** MAIN MENU ** 370 !***************** 380 CALL TITCLR :: DISPLAY AT(1,7):"VECTOR MATH MENU" 390 DISPLAY AT(3,2):"1. VECTOR ADDITION" 400 DISPLAY AT(5,2):"2. VECTOR SUBTRACTION" 410 DISPLAY AT(7,2):"3. DOT PRODUCT" 420 DISPLAY AT(9,2):"4. CROSS PRODUCT" 430 DISPLAY AT(11,2):"5. SCALAR MULTIPLY" 440 DISPLAY AT(13,2):"6. QUIT TO XB" 450 CALL KEY(0,K,S):: IF S=0 THEN 450 460 IF K=49 THEN 490 :: IF K=50 THEN 600 :: IF K=51 THEN 710 470 IF K=52 THEN 820 :: IF K=53 THEN 940 :: IF K=54 THEN 1070 480 IF K<49 OR K>51 THEN 450 490 !******************* 500 !** VEC. ADDITION ** 510 !******************* 520 CALL TITCLR :: DISPLAY AT(1,:"VECTOR ADDITION" 530 CALL CLR :: CALL OPTIONS :: CALL CLR 540 CALL VECTIN 550 FOR C=1 TO D :: SM(C)=V(1,C)+V(2,C)+V(3,C):: NEXT C 560 DISPLAY AT(20,1):"THE SUM IS:" 570 FOR C=1 TO D :: DISPLAY AT(21,2*C-1):SM(C):: NEXT C 580 CALL KEY(0,K,S):: IF S=0 THEN 580 :: CALL CLR :: CALL RESET 590 IF K=15 THEN 350 :: IF K<>15 THEN 490 600 !******************* 610 !** VEC. SUBTRACT ** 620 !******************* 630 CALL TITCLR :: DISPLAY AT(1,6):"VECTOR SUBTRACTION" 640 CALL CLR :: CALL OPTIONS :: CALL CLR 650 CALL VECTIN 660 FOR C=1 TO D :: SM(C)=V(1,C)-V(2,C)-V(3,C):: NEXT C 670 DISPLAY AT(20,1):"THE DIFFERENCE IS:" 680 FOR C=1 TO D :: DISPLAY AT(21,2*C-1):SM(C):: NEXT C 690 CALL KEY(0,K,S):: IF S=0 THEN 690 :: CALL CLR :: CALL RESET 700 IF K=15 THEN 350 :: IF K<>15 THEN 600 710 !******************** 720 !*** DOT PRODUCT *** 730 !******************** 740 CALL TITCLR :: DISPLAY AT(1,9):"DOT PRODUCT" 750 CALL CLR :: CALL OPTDP :: CALL CLR 760 CALL VECTIN :: DP=0 770 FOR C=1 TO D :: DP=DP+V(1,C)*V(2,C):: NEXT C 780 DISPLAY AT(20,1):"THE DOT PRODUCT IS:" 790 DISPLAY AT(21,2):DP 800 CALL KEY(0,K,S):: IF S=0 THEN 800 :: CALL CLR :: CALL RESET 810 IF K=15 THEN 350 :: IF K<>15 THEN 710 820 !******************** 830 !** CROSS PRODUCT ** 840 !******************** 850 CALL TITCLR :: DISPLAY AT(1,:"CROSS PRODUCT" 860 CALL CLR :: N=2 :: D=3 870 CALL VECTIN 880 CP(1)=V(1,2)*V(2,3)-V(1,3)*V(2,2):: CP(2)=V(1,3)*V(2,1)-V(1,1)*V(2,3) 890 CP(3)=V(1,1)*V(2,2)-V(1,2)*V(2,1) 900 DISPLAY AT(20,1):"THE CROSS PRODUCT IS:" 910 FOR I=1 TO 3 :: DISPLAY AT(21,6*I):CP(I):: NEXT I 920 CALL KEY(0,K,S):: IF S=0 THEN 800 :: CALL CLR :: CALL RESET 930 IF K=15 THEN 350 :: IF K<>15 THEN 820 940 !******************** 950 !** SCALAR PRODUCT ** 960 !******************** 970 CALL TITCLR :: DISPLAY AT(1,7):"SCALAR PRODUCT" 980 CALL CLR :: CALL OPTIONS :: CALL CLR 990 DISPLAY AT(3,1):"ENTER SCALAR: " 1000 ACCEPT AT(3,14)VALIDATE(NUMERIC,"-")BEEP:S :: CALL CLR 1010 CALL VECTIN :: CALL CLR 1020 FOR R=1 TO N :: FOR C=1 TO D 1030 V(R,C)=S*V(R,C):: NEXT C :: NEXT R 1040 CALL VECTOUT 1050 CALL KEY(0,K,S):: IF S=0 THEN 800 :: CALL CLR :: CALL RESET 1060 IF K=15 THEN 350 :: IF K<>15 THEN 940 1070 !*************** 1080 !** QUIT TO XB * 1090 !*************** 1100 CALL CLEAR :: END 1110 !******************** 1120 !*** SUB-ROUTINES *** 1130 !******************** 1140 SUB OPTDP 1150 N=2 1160 DISPLAY AT(3,1):"NUM. DIMENSIONS(1-15): " 1170 ACCEPT AT(3,24)VALIDATE(DIGIT)BEEP:D :: IF D<1 OR D>15 THEN 1170 1180 SUBEND 1190 SUB OPTIONS 1200 DISPLAY AT(3,1):"NUM. VECTORS(2-3): " 1210 ACCEPT AT(3,20)VALIDATE(DIGIT)BEEP:N :: IF N<2 OR N>3 THEN 1210 1220 DISPLAY AT(5,1):"NUM. DIMENSIONS(1-15): " 1230 ACCEPT AT(5,24)VALIDATE(DIGIT)BEEP:D :: IF D<1 OR D>15 THEN 1230 1240 SUBEND 1250 SUB VECTIN :: FOR I=1 TO N 1260 DISPLAY AT(3,9*I-:V$(I):: NEXT I 1270 FOR R=1 TO N :: FOR C=1 TO D 1280 ACCEPT AT(3+C,9*R-:V(R,C):: NEXT C :: NEXT R :: SUBEND 1290 SUB VECTOUT :: FOR I=1 TO N 1300 DISPLAY AT(3,9*I-:V$(I):: NEXT I 1310 FOR R=1 TO N :: FOR C=1 TO D 1320 DISPLAY AT(3+C,9*R-:V(R,C):: NEXT C :: NEXT R :: SUBEND 1330 SUB RESET 1340 FOR R=1 TO 3 :: FOR C=1 TO 15 1350 V(R,C)=0 :: NEXT C :: NEXT R 1360 FOR C=1 TO 15 :: SM(C)=0 :: NEXT C 1370 FOR C=1 TO 3 :: CP(C)=0 :: NEXT C 1380 SUBEND 1390 SUB CLR :: CALL HCHAR(3,1,32,704):: SUBEND 1400 SUB TITCLR :: CALL HCHAR(1,1,32,32):: SUBEND The running program appears to completely ignore the SUBprogram 'VECTIN', gives subscript errors in the SUBprogram 'RESET', and god knows what else. I thought I'd make use of user-defined functions in this program, but so far I seem to just be over my head, apparently. I've even gone as far as pre-setting null variables (line 180 and 190) just to try and avoid the subscript errors later on.... Edited July 5, 2014 by RobertLM78 Quote Link to comment Share on other sites More sharing options...
ti99_forever Posted June 20, 2014 Share Posted June 20, 2014 Subprograms don't have access to global variables. Anything needed needs to be passed. I see FOR I=1 TO N but N isn't passed to it, or initialized inside it. 1 Quote Link to comment Share on other sites More sharing options...
RobertLM78 Posted June 20, 2014 Author Share Posted June 20, 2014 So I need to pass the appropriate variables to the appropriate subprograms - that shouldn't be too hard to fix - thanks ti99_forever! Now, I wonder if fixing that issue will help fix the program of ignoring entire user-defined function CALLs. Quote Link to comment Share on other sites More sharing options...
Willsy Posted June 20, 2014 Share Posted June 20, 2014 So I need to pass the appropriate variables to the appropriate subprograms - that shouldn't be too hard to fix - thanks ti99_forever! Now, I wonder if fixing that issue will help fix the program of ignoring entire user-defined function CALLs. Yes. Like this: 10 N=40 20 CALL TEST(N) 30 SUB TEST(Z) 40 PRINT "GLOBAL VAR N IS":Z 50 SUBEND Note that you can receive the variable under any name you want. So, I passed in the global variable N (line 20), and I received it as a local variable called Z (line 30). The above technique passes in the variable by reference, meaning that the SUB can change it if you want: 10 N=40 20 CALL TEST(N) 30 PRINT "N AFTER CALL TO SUB IS":N 40 SUB TEST(Z) 50 PRINT "GLOBAL VAR N IS":Z 60 Z=Z+0.5 70 SUBEND So here, local variable Z is "tied" to global variable N (they both refer/point to the same thing in memory). If you don't need that facility, you just surround the variable with parenthesis when you call it: 10 N=40 20 CALL TEST((N)) 30 PRINT "N AFTER CALL TO SUB IS":N 40 SUB TEST(Z) 50 PRINT "GLOBAL VAR N IS":Z 60 Z=Z+0.5 70 SUBEND The above passes N to the SUB by value. Note line 20. Note also that upon return from the SUB, N has not changed. Hope this helps. Apologies if you know this stuff already. I'm a big fan of SUBs in XB and I used to use them all the time in XB when I was using that language back in the day. They produce much more readable and understandable programs. 1 Quote Link to comment Share on other sites More sharing options...
RobertLM78 Posted June 20, 2014 Author Share Posted June 20, 2014 Thanks for the clarification Willsy. I completely agree about SUBs making programs more legible - that's one of the biggest reasons I wanted to try using them . But, I should have RTFM more carefully... and I'm still having trouble with what I've got now, but I think it's closer to being functional than what I had originally . 160 !********************** 170 OPTION BASE 1 :: DIM V(3,15),V$(3),SM(15),CP(3) :: ON WARNING NEXT 180 !****************** 190 !** SET DISPLAY ** 200 !****************** 210 CALL CLEAR :: CALL SCREEN(5) 220 FOR CS=0 TO 12 :: CALL COLOR(CS,16,2) :: NEXT CS 230 U$="0000FFFF00000000" :: CALL CHAR(128,U$) :: CALL COLOR(13,11,2) 240 FOR I=1 TO 3 :: V$(I)="VECTOR"&STR$(I) :: NEXT I 250 DISPLAY AT(1,:"VECTOR MATH 1.0" :: CALL HCHAR(2,9,128,17) 260 DISPLAY AT(4,1):"VECTOR MATH DOES VECTOR" 270 DISPLAY AT(5,1):"OPERATIONS ON UP TO 3" 280 DISPLAY AT(6,1):"VECTORS IN UP TO 15-" 290 DISPLAY AT(7,1):"DIMENSIONAL SPACE." 300 DISPLAY AT(9,1):"(WHERE APPLICABLE )." 310 CALL KEY(0,K,S) :: IF S=0 THEN 310 320 CALL CLR :: CALL HCHAR(2,1,128,32) 330 !***************** 340 !** MAIN MENU ** 350 !***************** 360 CALL TITCLR :: DISPLAY AT(1,7):"VECTOR MATH MENU" 370 DISPLAY AT(3,2):"1. VECTOR ADDITION" 380 DISPLAY AT(5,2):"2. VECTOR SUBTRACTION" 390 DISPLAY AT(7,2):"3. DOT PRODUCT" 400 DISPLAY AT(9,2):"4. CROSS PRODUCT" 410 DISPLAY AT(11,2):"5. SCALAR MULTIPLY" 420 DISPLAY AT(13,2):"6. QUIT TO XB" 430 CALL KEY(0,K,S) :: IF S=0 THEN 430 440 IF K=49 THEN 470 :: IF K=50 THEN 580 :: IF K=51 THEN 690 450 IF K=52 THEN 800 :: IF K=53 THEN 920 :: IF K=54 THEN 1050 460 IF K<49 OR K>51 THEN 430 470 !******************* 480 !** VEC. ADDITION ** 490 !******************* 500 CALL TITCLR :: DISPLAY AT(1,:"VECTOR ADDITION" 510 CALL CLR :: CALL OPTIONS(N,D) :: CALL CLR 520 CALL VECTIN(N,D,V$(),V()) 530 FOR C=1 TO D :: SM(C)=V(1,C)+V(2,C)+V(3,C) :: NEXT C 540 DISPLAY AT(20,1):"THE SUM IS:" 550 CALL VECTOUT(N,D,V$(),V()) 560 CALL KEY(0,K,S) :: IF S=0 THEN 560 :: CALL CLR :: CALL RESET(V(),SM(),CP()) 570 IF K=15 THEN 330 :: IF K<>15 THEN 470 580 !******************* 590 !** VEC. SUBTRACT ** 600 !******************* 610 CALL TITCLR :: DISPLAY AT(1,6):"VECTOR SUBTRACTION" 620 CALL CLR :: CALL OPTIONS(N,D) :: CALL CLR 630 CALL VECTIN(N,D,V$(),V()) 640 FOR C=1 TO D :: SM(C)=V(1,C)-V(2,C)-V(3,C) :: NEXT C 650 DISPLAY AT(20,1):"THE DIFFERENCE IS:" 660 CALL VECTOUT(N,D,V$(),V()) 670 CALL KEY(0,K,S) :: IF S=0 THEN 670 :: CALL CLR :: CALL RESET(V(),SM(),CP()) 680 IF K=15 THEN 330 :: IF K<>15 THEN 580 690 !******************** 700 !*** DOT PRODUCT *** 710 !******************** 720 CALL TITCLR :: DISPLAY AT(1,9):"DOT PRODUCT" 730 CALL CLR :: CALL OPTDP(N,D) :: CALL CLR 740 CALL VECTIN(N,D,V$(),V()) :: DP=0 750 FOR C=1 TO D :: DP=DP+V(1,C)*V(2,C) :: NEXT C 760 DISPLAY AT(20,1):"THE DOT PRODUCT IS:" 770 DISPLAY AT(21,2):DP 780 CALL KEY(0,K,S) :: IF S=0 THEN 780 :: CALL CLR :: CALL RESET(V(),SM(),CP()) 790 IF K=15 THEN 330 :: IF K<>15 THEN 690 800 !******************** 810 !** CROSS PRODUCT ** 820 !******************** 830 CALL TITCLR :: DISPLAY AT(1,:"CROSS PRODUCT" 840 CALL CLR :: N=2 :: D=3 850 CALL VECTIN(N,D,V$(),V()) 860 CP(1)=V(1,2)*V(2,3)-V(1,3)*V(2,2) :: CP(2)=V(1,3)*V(2,1)-V(1,1)*V(2,3) 870 CP(3)=V(1,1)*V(2,2)-V(1,2)*V(2,1) 880 DISPLAY AT(20,1):"THE CROSS PRODUCT IS:" 890 FOR I=1 TO 3 :: DISPLAY AT(21,6*I):CP(I) :: NEXT I 900 CALL KEY(0,K,S) :: IF S=0 THEN 900 :: CALL CLR :: CALL RESET(V(),SM(),CP()) 910 IF K=15 THEN 330 :: IF K<>15 THEN 800 920 !******************** 930 !** SCALAR PRODUCT ** 940 !******************** 950 CALL TITCLR :: DISPLAY AT(1,7):"SCALAR PRODUCT" 960 CALL CLR :: CALL OPTIONS(N,D) :: CALL CLR 970 DISPLAY AT(3,1):"ENTER SCALAR: " 980 ACCEPT AT(3,14) VALIDATE(NUMERIC,"-") BEEP:S :: CALL CLR 990 CALL VECTIN(N,D,V$(),V()) :: CALL CLR 1000 FOR R=1 TO N :: FOR C=1 TO D 1010 V(R,C)=S*V(R,C) :: NEXT C :: NEXT R 1020 CALL VECTOUT2(N,D,V$(),V()) 1030 CALL KEY(0,K,S):: IF S=0 THEN 1030 :: CALL CLR :: CALL RESET(V(),SM(),CP()) 1040 IF K=15 THEN 330 :: IF K<>15 THEN 920 1050 !*************** 1060 !** QUIT TO XB * 1070 !*************** 1080 CALL CLEAR :: END 1090 !******************** 1100 !*** SUB-ROUTINES *** 1110 !******************** 1120 !**** SUB 1 **** 1130 SUB OPTDP(N,D) 1140 N=2 1150 DISPLAY AT(3,1):"NUM. DIMENSIONS(1-15): " 1160 ACCEPT AT(3,24) VALIDATE(DIGIT) BEEP:D :: IF D<1 OR D>15 THEN 1160 1170 SUBEND 1180 !**** SUB 2 **** 1190 SUB OPTIONS(N,D) 1200 DISPLAY AT(3,1):"NUM. VECTORS(2-3): " 1210 ACCEPT AT(3,20) VALIDATE(DIGIT) BEEP:N :: IF N<2 OR N>3 THEN 1210 1220 DISPLAY AT(5,1):"NUM. DIMENSIONS(1-15): " 1230 ACCEPT AT(5,24) VALIDATE(DIGIT) BEEP:D :: IF D<1 OR D>15 THEN 1230 1240 SUBEND 1250 !**** SUB 3 **** 1260 SUB VECTIN(N,D,V$(),V()) :: FOR I=1 TO N 1270 DISPLAY AT(3,9*I-:V$(I) :: NEXT I 1280 FOR R=1 TO N :: FOR C=1 TO D 1290 ACCEPT AT(3+C,9*R-:V(R,C) :: NEXT C :: NEXT R :: SUBEND 1300 !**** SUB 4 **** 1310 SUB VECTOUT(N,D,V$(),V()) 1320 FOR C=1 TO D 1330 IF C<=4 THEN DISPLAY AT(21,7*C-6):SM(C) 1340 IF C>4 AND C<=8 THEN DISPLAY AT(22,7*C-34):SM(C) 1350 IF C>8 AND C<=12 THEN DISPLAY AT(23,7*C-62):SM(C) 1360 IF C>12 THEN DISPLAY AT(24,7*C-90):SM(C) 1370 NEXT C :: SUBEND 1380 !**** SUB 5 **** 1390 SUB VECTOUT2(N,D,V$(),V()) :: FOR I=1 TO N 1400 DISPLAY AT(3,9*I-:V$(I) :: NEXT I 1410 FOR R=1 TO N :: FOR C=1 TO D 1420 DISPLAY AT(3+C,9*R-:V(R,C) :: NEXT C :: NEXT R :: SUBEND 1430 !**** SUB 6 **** 1440 SUB RESET(V(),SM(),CP()) 1450 FOR R=1 TO 3 :: FOR C=1 TO 15 1460 V(R,C)=0 :: NEXT C :: NEXT R 1470 FOR C=1 TO 15 :: SM(C)=0 :: NEXT C 1480 FOR C=1 TO 3 :: CP(C)=0 :: NEXT C 1490 SUBEND 1500 !**** SUB 7 **** 1510 SUB CLR :: CALL HCHAR(3,1,32,704) :: SUBEND 1520 !**** SUB 8 **** 1530 SUB TITCLR :: CALL HCHAR(1,1,32,32) :: SUBEND Wanting to get this thing working yesterday, I re-tooled my approach, and replaced most of the SUBs with GOSUBs. It works, but it's not quite as cool as what I was wanting: 160 !********************** 170 OPTION BASE 1 :: DIM V(3,15),V$(3),SM(15),CP(3):: ON WARNING NEXT 180 !****************** 190 !** SET DISPLAY ** 200 !****************** 210 CALL CLEAR :: CALL SCREEN(5) 220 FOR CS=0 TO 12 :: CALL COLOR(CS,16,2):: NEXT CS 230 U$="0000FFFF00000000" :: CALL CHAR(128,U$):: CALL COLOR(13,11,2) 240 FOR I=1 TO 3 :: V$(I)="VECTOR"&STR$(I):: NEXT I 250 DISPLAY AT(1,7):"VECTOR MATH 1.0" :: CALL HCHAR(2,8,128,17) 260 DISPLAY AT(5,1):"VECTOR MATH DOES VECTOR" 270 DISPLAY AT(7,1):"OPERATIONS ON UP TO 3" 280 DISPLAY AT(9,1):"VECTORS IN UP TO 15-" 290 DISPLAY AT(11,1):"DIMENSIONAL SPACE." 300 DISPLAY AT(14,1):"(WHERE APPLICABLE )." 310 CALL KEY(0,K,S):: IF S=0 THEN 310 320 CALL CLR :: CALL HCHAR(2,1,128,32) 330 !***************** 340 !** MAIN MENU ** 350 !***************** 360 CALL TITCLR :: DISPLAY AT(1,6):"VECTOR MATH MENU" 370 DISPLAY AT(4,2):"1. VECTOR ADDITION" 380 DISPLAY AT(6,2):"2. VECTOR SUBTRACTION" 390 DISPLAY AT(8,2):"3. DOT PRODUCT" 400 DISPLAY AT(10,2):"4. CROSS PRODUCT" 410 DISPLAY AT(12,2):"5. SCALAR MULTIPLY" 420 DISPLAY AT(14,2):"6. QUIT TO XB" 430 CALL KEY(0,K,S):: IF S=0 THEN 430 440 IF K=49 THEN 470 :: IF K=50 THEN 580 :: IF K=51 THEN 690 450 IF K=52 THEN 800 :: IF K=53 THEN 920 :: IF K=54 THEN 1050 460 IF K<49 OR K>51 THEN 430 470 !******************* 480 !** VEC. ADDITION ** 490 !******************* 500 CALL TITCLR :: DISPLAY AT(1,7):"VECTOR ADDITION" 510 CALL CLR :: GOSUB 1180 :: CALL CLR !** GEN OPTIONS **** 520 GOSUB 1310 !** VECTOR INPUT **** 530 FOR C=1 TO D :: SM(C)=V(1,C)+V(2,C)+V(3,C):: NEXT C 540 DISPLAY AT(20,1):"THE SUM IS:" 550 GOSUB 1410 !** VECTOR OUTPUT **** 560 CALL KEY(0,K,S):: IF S=0 THEN 560 :: CALL CLR :: GOSUB 1490 570 IF K=15 THEN 330 :: IF K<>15 THEN 470 580 !******************* 590 !** VEC. SUBTRACT ** 600 !******************* 610 CALL TITCLR :: DISPLAY AT(1,5):"VECTOR SUBTRACTION" 620 CALL CLR :: GOSUB 1180 :: CALL CLR !** GEN OPTIONS **** 630 GOSUB 1310 !** VECTOR INPUT **** 640 FOR C=1 TO D :: SM(C)=V(1,C)-V(2,C)-V(3,C):: NEXT C 650 DISPLAY AT(20,1):"THE DIFFERENCE IS:" 660 GOSUB 1410 !** VECTOR OUTPUT **** 670 CALL KEY(0,K,S):: IF S=0 THEN 670 :: CALL CLR :: GOSUB 1490 680 IF K=15 THEN 330 :: IF K<>15 THEN 580 690 !******************** 700 !*** DOT PRODUCT *** 710 !******************** 720 CALL TITCLR :: DISPLAY AT(1,9):"DOT PRODUCT" 730 CALL CLR :: GOSUB 1120 :: CALL CLR !** DP OPTIONS **** 740 GOSUB 1310 :: DP=0 !** VECTOR INPUT **** 750 FOR C=1 TO D :: DP=DP+V(1,C)*V(2,C):: NEXT C 760 DISPLAY AT(20,1):"THE DOT PRODUCT IS:" 770 DISPLAY AT(21,2):DP 780 CALL KEY(0,K,S):: IF S=0 THEN 780 :: CALL CLR :: GOSUB 1490 790 IF K=15 THEN 330 :: IF K<>15 THEN 690 800 !******************** 810 !** CROSS PRODUCT ** 820 !******************** 830 CALL TITCLR :: DISPLAY AT(1,:"CROSS PRODUCT" 840 CALL CLR :: N=2 :: D=3 850 GOSUB 1310 !** VECTOR INPUT **** 860 CP(1)=V(1,2)*V(2,3)-V(1,3)*V(2,2):: CP(2)=V(1,3)*V(2,1)-V(1,1)*V(2,3) 870 CP(3)=V(1,1)*V(2,2)-V(1,2)*V(2,1) 880 DISPLAY AT(20,1):"THE CROSS PRODUCT IS:" 890 FOR I=1 TO 3 :: DISPLAY AT(21,6*I):CP(I):: NEXT I 900 CALL KEY(0,K,S):: IF S=0 THEN 900 :: CALL CLR :: GOSUB 1490 910 IF K=15 THEN 330 :: IF K<>15 THEN 800 920 !******************** 930 !** SCALAR PRODUCT ** 940 !******************** 950 CALL TITCLR :: DISPLAY AT(1,7):"SCALAR PRODUCT" 960 CALL CLR :: GOSUB 1250 :: CALL CLR !** GEN OPTIONS **** 970 DISPLAY AT(3,1):"ENTER SCALAR: " 980 ACCEPT AT(3,14)VALIDATE(NUMERIC,"-")BEEP:S :: CALL CLR 990 GOSUB 1310 :: CALL CLR !** VECTOR INPUT **** 1000 FOR R=1 TO N :: FOR C=1 TO D 1010 V(R,C)=S*V(R,C):: NEXT C :: NEXT R 1020 GOSUB 1360 !** VECTOR OUTPUT **** 1030 CALL KEY(0,K,S):: IF S=0 THEN 1030 :: CALL CLR :: GOSUB 1490 1040 IF K=15 THEN 330 :: IF K<>15 THEN 920 1050 !*************** 1060 !** QUIT TO XB * 1070 !*************** 1080 CALL CLEAR :: END 1090 !******************** 1100 !*** SUB-ROUTINES *** 1110 !******************** 1120 !**** SUB 1 **** 1130 !** DP OPTIONS *** 1140 N=2 1150 DISPLAY AT(3,1):"NUM. DIMENSIONS(1-15): " 1160 ACCEPT AT(3,24)VALIDATE(DIGIT)BEEP:D :: IF D<1 OR D>15 THEN 1160 1170 RETURN 1180 !**** SUB 2 **** 1190 !** GEN OPTIONS ** 1200 DISPLAY AT(3,1):"NUM. VECTORS(2-3): " 1210 ACCEPT AT(3,20)VALIDATE(DIGIT)BEEP:N :: IF N<2 OR N>3 THEN 1210 1220 DISPLAY AT(5,1):"NUM. DIMENSIONS(1-15): " 1230 ACCEPT AT(5,24)VALIDATE(DIGIT)BEEP:D :: IF D<1 OR D>15 THEN 1230 1240 RETURN 1250 DISPLAY AT(3,1):"NUM. VECTORS(1-3): " 1260 ACCEPT AT(3,20)VALIDATE(DIGIT)BEEP:N :: IF N<1 OR N>3 THEN 1260 1270 DISPLAY AT(5,1):"NUM. DIMENSIONS(1-15): " 1280 ACCEPT AT(5,24)VALIDATE(DIGIT)BEEP:D :: IF D<1 OR D>15 THEN 1280 1290 RETURN 1300 !**** SUB 3 **** 1310 !* VECTOR INPUT ** 1320 FOR I=1 TO N :: DISPLAY AT(3,9*I-:V$(I):: NEXT I 1330 FOR R=1 TO N :: FOR C=1 TO D 1340 ACCEPT AT(3+C,9*R-8)VALIDATE(NUMERIC,"-"):V(R,C):: NEXT C :: NEXT R 1350 RETURN 1360 !***** SUB 4 ***** 1370 !*VEC OUTPUT (SCALR)** 1380 FOR I=1 TO N :: DISPLAY AT(3,9*I-:V$(I):: NEXT I 1390 FOR R=1 TO N :: FOR C=1 TO D 1400 DISPLAY AT(3+C,9*R-:V(R,C):: NEXT C :: NEXT R :: RETURN 1410 !**** SUB 5 **** 1420 !*VECTOR OUTPUT ** 1430 FOR C=1 TO D 1440 IF C<=4 THEN DISPLAY AT(21,7*C-6):SM(C) 1450 IF C>4 AND C<=8 THEN DISPLAY AT(22,7*C-34):SM(C) 1460 IF C>8 AND C<=12 THEN DISPLAY AT(23,7*C-62):SM(C) 1470 IF C>12 THEN DISPLAY AT(24,7*C-90):SM(C) 1480 NEXT C :: RETURN 1490 !**** SUB 6 **** 1500 !*** RESET VAR.*** 1510 FOR R=1 TO 3 :: FOR C=1 TO 15 1520 V(R,C)=0 :: NEXT C :: NEXT R 1530 FOR C=1 TO 15 :: SM(C)=0 :: NEXT C 1540 FOR C=1 TO 3 :: CP(C)=0 :: NEXT C 1550 RETURN 1560 !**** SUB 7 **** 1570 SUB CLR :: CALL HCHAR(3,1,32,704):: SUBEND 1580 !**** SUB 8 **** 1590 SUB TITCLR :: CALL HCHAR(1,1,32,32):: SUBEND Quote Link to comment Share on other sites More sharing options...
RobertLM78 Posted June 20, 2014 Author Share Posted June 20, 2014 Hmmm... I think I might see what's going on, do I need to DIM the arrarys within the SUBprograms since SUB variables are 'local' (even though the ones being passed have the same name)? Quote Link to comment Share on other sites More sharing options...
Willsy Posted June 20, 2014 Share Posted June 20, 2014 If you are passing an array then you need to use this syntax in your call: CALL MYSUB (MYARRAY()) That assumes a single dimensioned array. If the array has 2 dimensions then you need a comma: CALL MYSUB (MYARRAY (,)) Check the manual though. My memory is hazy. Also check the errata for the XB manual. 1 Quote Link to comment Share on other sites More sharing options...
RobertLM78 Posted June 20, 2014 Author Share Posted June 20, 2014 I just read about the multi-dimension array - the comma is the correct syntax (unfortunately, the manual doesn't have any examples of SUBs with arrays). It's totally why I got the bad name error in 520 . Thanks again WIllsy, a.k.a. eagle eye Quote Link to comment Share on other sites More sharing options...
RobertLM78 Posted June 20, 2014 Author Share Posted June 20, 2014 (edited) And it's working!! Thank you ti99_forever and Willsy! I have a good handle on these SUBs now . 160 !********************** 170 OPTION BASE 1 :: DIM V(3,15),V$(3),SM(15),CP(3) :: ON WARNING NEXT 180 !****************** 190 !** SET DISPLAY ** 200 !****************** 210 CALL CLEAR :: CALL SCREEN(5) 220 FOR CS=0 TO 12 :: CALL COLOR(CS,16,2) :: NEXT CS 230 U$="0000FFFF00000000" :: CALL CHAR(128,U$) :: CALL COLOR(13,11,2) 240 FOR I=1 TO 3 :: V$(I)="VECTOR"&STR$(I) :: NEXT I 250 DISPLAY AT(1,:"VECTOR MATH 1.0" :: CALL HCHAR(2,9,128,17) 260 DISPLAY AT(4,1):"VECTOR MATH DOES VECTOR" 270 DISPLAY AT(5,1):"OPERATIONS ON UP TO 3" 280 DISPLAY AT(6,1):"VECTORS IN UP TO 15-" 290 DISPLAY AT(7,1):"DIMENSIONAL SPACE." 300 DISPLAY AT(9,1):"(WHERE APPLICABLE )." 310 CALL KEY(0,K,S) :: IF S=0 THEN 310 320 CALL CLR :: CALL HCHAR(2,1,128,32) 330 !***************** 340 !** MAIN MENU ** 350 !***************** 360 CALL TITCLR :: DISPLAY AT(1,7):"VECTOR MATH MENU" 370 DISPLAY AT(3,2):"1. VECTOR ADDITION" 380 DISPLAY AT(5,2):"2. VECTOR SUBTRACTION" 390 DISPLAY AT(7,2):"3. DOT PRODUCT" 400 DISPLAY AT(9,2):"4. CROSS PRODUCT" 410 DISPLAY AT(11,2):"5. SCALAR MULTIPLY" 420 DISPLAY AT(13,2):"6. QUIT TO XB" 430 CALL KEY(0,K,S) :: IF S=0 THEN 430 440 IF K=49 THEN 470 :: IF K=50 THEN 580 :: IF K=51 THEN 690 450 IF K=52 THEN 800 :: IF K=53 THEN 920 :: IF K=54 THEN 1050 460 IF K<49 OR K>51 THEN 430 470 !******************* 480 !** VEC. ADDITION ** 490 !******************* 500 CALL TITCLR :: DISPLAY AT(1,:"VECTOR ADDITION" 510 CALL CLR :: CALL OPTIONS(N,D) :: CALL CLR 520 CALL VECTIN((N),(D),V$(),V(,)) 530 FOR C=1 TO D :: SM(C)=V(1,C)+V(2,C)+V(3,C) :: NEXT C 540 DISPLAY AT(20,1):"THE SUM IS:" 550 CALL VECTOUT((D),SM()) 560 CALL KEY(0,K,S) :: IF S=0 THEN 560 :: CALL CLR 565 CALL RESET(V(,),SM(),CP()) 570 IF K=15 THEN 330 :: IF K<>15 THEN 470 580 !******************* 590 !** VEC. SUBTRACT ** 600 !******************* 610 CALL TITCLR :: DISPLAY AT(1,6):"VECTOR SUBTRACTION" 620 CALL CLR :: CALL OPTIONS(N,D) :: CALL CLR 630 CALL VECTIN((N),(D),V$(),V(,)) 640 FOR C=1 TO D :: SM(C)=V(1,C)-V(2,C)-V(3,C) :: NEXT C 650 DISPLAY AT(20,1):"THE DIFFERENCE IS:" 660 CALL VECTOUT((D),SM()) 670 CALL KEY(0,K,S) :: IF S=0 THEN 670 :: CALL CLR 675 CALL RESET(V(,),SM(),CP()) 680 IF K=15 THEN 330 :: IF K<>15 THEN 580 690 !******************** 700 !*** DOT PRODUCT *** 710 !******************** 720 CALL TITCLR :: DISPLAY AT(1,9):"DOT PRODUCT" 730 CALL CLR :: CALL OPTDP(N,D) :: CALL CLR 740 CALL VECTIN((N),(D),V$(),V(,)) :: DP=0 750 FOR C=1 TO D :: DP=DP+V(1,C)*V(2,C) :: NEXT C 760 DISPLAY AT(20,1):"THE DOT PRODUCT IS:" 770 DISPLAY AT(21,2):DP 780 CALL KEY(0,K,S) :: IF S=0 THEN 780 :: CALL CLR 785 CALL RESET(V(,),SM(),CP()) 790 IF K=15 THEN 330 :: IF K<>15 THEN 690 800 !******************** 810 !** CROSS PRODUCT ** 820 !******************** 830 CALL TITCLR :: DISPLAY AT(1,:"CROSS PRODUCT" 840 CALL CLR :: N=2 :: D=3 850 CALL VECTIN((N),(D),V$(),V(,)) 860 CP(1)=V(1,2)*V(2,3)-V(1,3)*V(2,2) :: CP(2)=V(1,3)*V(2,1)-V(1,1)*V(2,3) 870 CP(3)=V(1,1)*V(2,2)-V(1,2)*V(2,1) 880 DISPLAY AT(20,1):"THE CROSS PRODUCT IS:" 890 FOR I=1 TO 3 :: DISPLAY AT(21,6*I):CP(I) :: NEXT I 900 CALL KEY(0,K,S) :: IF S=0 THEN 900 :: CALL CLR 905 CALL RESET(V(,),SM(),CP()) 910 IF K=15 THEN 330 :: IF K<>15 THEN 800 920 !******************** 930 !** SCALAR PRODUCT ** 940 !******************** 950 CALL TITCLR :: DISPLAY AT(1,7):"SCALAR PRODUCT" 960 CALL CLR :: CALL OPTIONS(N,D) :: CALL CLR 970 DISPLAY AT(3,1):"ENTER SCALAR: " 980 ACCEPT AT(3,14) VALIDATE(NUMERIC,"-") BEEP:S :: CALL CLR 990 CALL VECTIN((N),(D),V$(),V(,)) :: CALL CLR 1000 FOR R=1 TO N :: FOR C=1 TO D 1010 V(R,C)=S*V(R,C) :: NEXT C :: NEXT R 1020 CALL VECTOUT2((N),(D),V$(),V(,)) 1030 CALL KEY(0,K,S) :: IF S=0 THEN 1030 :: CALL CLR 1035 CALL RESET(V(,),SM(),CP()) 1040 IF K=15 THEN 330 :: IF K<>15 THEN 920 1050 !*************** 1060 !** QUIT TO XB * 1070 !*************** 1080 CALL CLEAR :: END 1090 !******************** 1100 !*** SUB-ROUTINES *** 1110 !******************** 1120 !**** SUB 1 **** 1130 SUB OPTDP(N,D) 1140 N=2 1150 DISPLAY AT(3,1):"NUM. DIMENSIONS(1-15): " 1160 ACCEPT AT(3,24) VALIDATE(DIGIT) BEEP:D :: IF D<1 OR D>15 THEN 1160 1170 SUBEND 1180 !**** SUB 2 **** 1190 SUB OPTIONS(N,D) 1200 DISPLAY AT(3,1):"NUM. VECTORS(2-3): " 1210 ACCEPT AT(3,20) VALIDATE(DIGIT) BEEP:N :: IF N<2 OR N>3 THEN 1210 1220 DISPLAY AT(5,1):"NUM. DIMENSIONS(1-15): " 1230 ACCEPT AT(5,24) VALIDATE(DIGIT) BEEP:D :: IF D<1 OR D>15 THEN 1230 1240 SUBEND 1250 !**** SUB 3 **** 1260 SUB VECTIN(N,D,V$(),V(,)) :: FOR I=1 TO N 1270 DISPLAY AT(3,9*I-:V$(I) :: NEXT I 1280 FOR R=1 TO N :: FOR C=1 TO D 1290 ACCEPT AT(3+C,9*R-:V(R,C) :: NEXT C :: NEXT R :: SUBEND 1300 !**** SUB 4 **** 1310 SUB VECTOUT(D,SM()) 1320 FOR C=1 TO D 1330 IF C<=4 THEN DISPLAY AT(21,7*C-6):SM(C) 1340 IF C>4 AND C<=8 THEN DISPLAY AT(22,7*C-34):SM(C) 1350 IF C>8 AND C<=12 THEN DISPLAY AT(23,7*C-62):SM(C) 1360 IF C>12 THEN DISPLAY AT(24,7*C-90):SM(C) 1370 NEXT C :: SUBEND 1380 !**** SUB 5 **** 1390 SUB VECTOUT2(N,D,V$(),V(,)) :: FOR I=1 TO N 1400 DISPLAY AT(3,9*I-:V$(I) :: NEXT I 1410 FOR R=1 TO N :: FOR C=1 TO D 1420 DISPLAY AT(3+C,9*R-:V(R,C) :: NEXT C :: NEXT R :: SUBEND 1430 !**** SUB 6 **** 1440 SUB RESET(V(,),SM(),CP()) 1450 FOR R=1 TO 3 :: FOR C=1 TO 15 1460 V(R,C)=0 :: NEXT C :: NEXT R 1470 FOR C=1 TO 15 :: SM(C)=0 :: NEXT C 1480 FOR C=1 TO 3 :: CP(C)=0 :: NEXT C 1490 SUBEND 1500 !**** SUB 7 **** 1510 SUB CLR :: CALL HCHAR(3,1,32,704) :: SUBEND 1520 !**** SUB 8 **** 1530 SUB TITCLR :: CALL HCHAR(1,1,32,32) :: SUBEND Edit: it was close with the last one, but I had made some silly errors Edited June 20, 2014 by RobertLM78 1 Quote Link to comment Share on other sites More sharing options...
Willsy Posted June 21, 2014 Share Posted June 21, 2014 Good job! SUBs rule! Quote Link to comment Share on other sites More sharing options...
RobertLM78 Posted June 21, 2014 Author Share Posted June 21, 2014 Thanks bud! SUBs sure do rule! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.