Forum huvudsida -> Programmering -> asså jag fattar inte!
Sidor: 1
jockepockee | 15:54 - 17:e Maj 2007 | Post #1 | |
Medlem Inlägg: 192 Skicka PM |
när jag kompilerar kärnan till mitt test os så säger kompilatorn : keyb.cpp: In function `char getline()´: keyb.cpp:66: invalid conversion from `char*´ to `char´ keyb.cpp:71: invalid conversion from `char*´ to `char´ keyb.cpp:61: warning: address of local variable `ret´ returned men jag fattar inte att den tolkar ret som en pekare men iallafall här är koden till keyb.cpp: #include "vid.h" #include "keyb.h" #include "io.h" unsigned char kbdus[128] = { 0, 27, '1', '2', '3', '4', '5', '6', '7', '8', /* 9 */ '9', '0', '-', '=', '\b', /* Backspace */ '\t', /* Tab */ 'q', 'w', 'e', 'r', /* 19 */ 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', /* Enter key */ 0, /* 29 - Control */ 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', /* 39 */ ''', '`', 0, /* Left shift */ '', 'z', 'x', 'c', 'v', 'b', 'n', /* 49 */ 'm', ',', '.', '/', 0, /* Right shift */ '*', 0, /* Alt */ ' ', /* Space bar */ 0, /* Caps lock */ 0, /* 59 - F1 key ... > */ 0, 0, 0, 0, 0, 0, 0, 0, 0, /* < ... F10 */ 0, /* 69 - Num lock*/ 0, /* Scroll Lock */ 0, /* Home key */ 0, /* Up Arrow */ 0, /* Page Up */ '-', 0, /* Left Arrow */ 0, 0, /* Right Arrow */ '+', 0, /* 79 - End key*/ 0, /* Down Arrow */ 0, /* Page Down */ 0, /* Insert Key */ 0, /* Delete Key */ 0, 0, 0, 0, /* F11 Key */ 0, /* F12 Key */ 0, /* All other keys are undefined */ }; char getch() { char scancode = inportb(0x60); char ch = kbdus[scancode]; outportb(0x20, 0x20); while (inportb(0x60)) { hlt(); } return ch; } char getline() { int cc = 0; char ret[360]; while (ret[cc - 1] != '\n') { ret[cc] = getch(); put(ret); cc++; } return ret; } inline void hlt() { asm volatile("hlt"); } -------------------------
Senast redigerad 16:04 - 17:e Maj 2007 |
ozamosi | 17:00 - 17:e Maj 2007 | Post #2 | |
Administratör Inlägg: 1129 Skicka PM |
Du returnerar ret som är en charpekare och inte en char. ------------------------- Ljusblå |
jockepockee | 17:12 - 17:e Maj 2007 | Post #3 | |
Medlem Inlägg: 192 Skicka PM |
men deklareras inte en pekare med tecknet "*"? -------------------------
|
Slash | 17:50 - 17:e Maj 2007 | Post #4 | |
Medlem Inlägg: 141 Skicka PM |
Citat av jockepockee: när jag kompilerar kärnan till mitt test os så säger kompilatorn : char getline() { int cc = 0; char ret[360]; while (ret[cc - 1] != 'n') { ret[cc] = getch(); put(ret); cc++; } return ret; } Om du hade tänkt att att returnera raden så är just detta inget bra sätt tyvärr. Vektorn ret kommer att hamna på stacken och kommer att försvinna så fort din funktion returnerar. Sätten det brukar göras på i C är att antingen skicka in en buffer till funktionen eller allokera minnet i funktionen (vilket har nackdelen att du måste komma ihåg att free:a det). Så alltså
eller
------------------------- Ingen sigantur! |
jockepockee | 20:33 - 17:e Maj 2007 | Post #5 | |
Medlem Inlägg: 192 Skicka PM |
men hur gör man så att funtionen getline() hämtar ch från getch()? likadant eller? -------------------------
|
Slash | 23:07 - 17:e Maj 2007 | Post #6 | |
Medlem Inlägg: 141 Skicka PM |
Citat av jockepockee: men hur gör man så att funtionen getline() hämtar ch från getch()? likadant eller? Funktionen getch returnerar ju bara en char, så det är bara att anropa den som vanligt. Skillnaden är att när du i C definierar en array så representeras den utav en pekare till dess första element.
Så om du i en annan funktion skriver:
Så kommer temp innehålla samma minnesadress som pek i funktionen get_something. Men grejen är att datat det den minneadressen pekade på kommer ha försvunnet så den pekaren är värdelös. Jämför istället:
Då kommer
mychar innehålla samma värde som ch i get_var(), fast nu är det ju värdet direkt du är intresserad av så det spelar ingen roll att ch kommer försvinna från stacken då du redan ha en kopia av dess värde i mychar Ursäktar för mina fantasilösa funktionsnamn ------------------------- Ingen sigantur! Senast redigerad 23:08 - 17:e Maj 2007 |
jockepockee | 01:31 - 18:e Maj 2007 | Post #7 | |
Medlem Inlägg: 192 Skicka PM |
ok, men om jag nu vill ha en array med alla tecken som returnerats från getch() tills getch() returnerar "\n", då vet jag ju inge mer sätt än att loopa allt som jag gjorde först, men då blir de ju fel -------------------------
|
Slash | 08:44 - 18:e Maj 2007 | Post #8 | |
Medlem Inlägg: 141 Skicka PM |
Citat av jockepockee: ok, men om jag nu vill ha en array med alla tecken som returnerats från getch() tills getch() returnerar "n", då vet jag ju inge mer sätt än att loopa allt som jag gjorde först, men då blir de ju fel Personligen skulle jag nog gå på att skicka med en buffer till getline. Typ
Provkompilering och buggfixning ej gjord. ------------------------- Ingen sigantur! |
Sidor: 1
Forum huvudsida -> Programmering -> asså jag fattar inte!
Du får inte posta i den här tråden | Till toppen
Datum
2024-05-05 03:58
Vecka: 18
Besökare
Inloggade: 0
Gäster: 605
Medlemmar
Medlemmar: 53576
Forum
Senaste inlägget: HAHA MÄNNISKAN LEVER ÄN (13:45 - 18:e Januari 2019, av Hetzz)
Wiki
Senaste ändringen:
3D (rev: 1, tid: 09:40 - 13:e November 2015)
Chatt
#blinkenlights @ Libera.Chat
Gratis shellkonton för IRC, webbsidor mm.