Jump to content
IGNORED

[Solved] XB subprograms - help needed!


RobertLM78

Recommended Posts

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 by RobertLM78
Link to comment
Share on other sites

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.

  • Like 1
Link to comment
Share on other sites

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

 

 

Link to comment
Share on other sites

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.

  • Like 1
Link to comment
Share on other sites

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 :dunce:

Edited by RobertLM78
  • Like 1
Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...