Forum: asså jag fattar inte!

Forum huvudsida -> Programmering -> asså jag fattar inte!

Sidor: 1

Till botten

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å

  1.  
  2.  
  3. char* getline(char *buffer, int buffer_size) {
  4. // getlinea max buffer_size antal tecken till buffer
  5. return buffer;
  6. }
  7.  


eller

  1.  
  2.  
  3. char* getline() {
  4. int buffer_size = 256;
  5. char *buffer = (char*)malloc(buffer_size);
  6. // getlinea max buffer_size antal tecken till buffer
  7.  
  8. // Istället för att ha ett fixt antal tecken så kan
  9. // du allokera så mycket minne som behövs
  10. // genom ett lite mer komplext tillvägagångs-
  11. // sätt. Men det beror ju på dina behov
  12.  
  13. return buffer;
  14. }
  15.  


-------------------------
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.

  1. char* get_something() {
  2. char pek[256];
  3. // Pek kommer nu innehålla en minnesadress
  4. return pek;
  5. }


Så om du i en annan funktion skriver:
  1. char *temp = get_something();


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:

  1. char get_var() {
  2. char ch = 34;
  3. return ch;
  4. }


Då kommer

  1. char mychar = get_var();


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 funktionsnamnSmiley

-------------------------
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 felSmiley

-------------------------





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 felSmiley


Personligen skulle jag nog gå på att skicka med en buffer till getline. Typ

  1. int getline(char *buffer, int buffer_size) {
  2. int i = 0;
  3. char ch;
  4.  
  5. while (i < buffer_size-1 && (ch = getch()) != '\n')
  6. buffer[i++] = ch;
  7.  
  8. buffer[i] = 0;
  9. return i;
  10. }
  11.  
  12. int main() {
  13. char line[256];
  14. int linelength;
  15.  
  16.  
  17. linelength = getline(line, 256);
  18. }


Provkompilering och buggfixning ej gjord.

-------------------------
Ingen sigantur!



Sidor: 1

Forum huvudsida -> Programmering -> asså jag fattar inte!
Atom feed

Du får inte posta i den här tråden | Till toppen