質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

5387閲覧

関数の中で関数を呼び出せない

kazuyakazuya

総合スコア193

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/03/20 08:39

わけあってどうしても関数の中で関数を呼び出さなければいけないのですが・・・

aaa関数の中で protect_puts関数を呼び出すようにし
aaa関数をmain関数で呼び出すようにしたいです。

(main関数の中でprotect_putsを直接呼び出す場合はうまく動きます。)

c

1void aaa(void); 2void protect_puts(char *char_address,int bytes,int side_size,int height_size); 3 4 5void main_kernel(){ 6void aaa(); 7} 8 9void aaa(){ 10 char ptr[] = "abcdefghigk"; 11 char *a = ptr; 12 protect_puts(a,11,5,5); 13} 14 15 16 17void protect_puts(char *char_address,int bytes,int side_size,int height_size){ 18 int vram_address = 0xA0000; 19 int font_address = 0x0500; 20 int byte_count = bytes; 21 int yoko = side_size; 22 int tate = height_size; 23 char *ptrr = char_address; 24 25 __asm__ __volatile__( 26 27 "mov %7,%%eax\n\t" 28 "mov %5,%%ebx\n\t" 29 "add %%eax,%%ebx\n\t" 30 "mov %%ebx,%2\n\t" 31 32 33 "mov %8,%%eax\n\t" 34 "mov $1280,%%ebx\n\t" 35 "mul %%ebx\n\t" 36 "mov %5,%%ebx\n\t" 37 "add %%eax,%%ebx\n\t" 38 "mov %%ebx,%2\n\t" 39 40 41 "mov %6,%%eax\n\t" 42 "mov %3,%%ebx\n\t" 43 ".protect_puts_loop2:\n\t" 44 "cmp $0,%%ebx\n\t" 45 "jz .endd\n\t" 46 47 "xor %%esi,%%esi\n\t" 48 "mov (%%eax),%%esi\n\t" 49 "and $0b00000000000000000000000011111111,%%esi\n\t" 50 "shl $4,%%esi\n\t" 51 52 "xor %%ebx,%%ebx\n\t" 53 "mov %4,%%ebx\n\t" 54 "add %%ebx,%%esi\n\t" 55 56 57 "mov %5,%%edi\n\t" 58 59 "mov $16,%%ecx\n\t" /* 1文字 縦16bitだから */ 60 61 ".protect_puts_loop:\n\t" 62 "movsb\n\t" 63 "add $80 - 1,%%edi\n\t" 64 "loop .protect_puts_loop\n\t" 65 66 "inc %%eax\n\t" 67 68 "xor %%ebx,%%ebx\n\t" 69 70 "mov %5,%%ebx\n\t" 71 "add $1,%%ebx\n\t" 72 "mov %%ebx,%2\n\t" 73 74 "mov %3,%%ebx\n\t" 75 "sub $1,%%ebx\n\t" 76 "mov %%ebx,%0\n\t" 77 "mov %3,%%ebx\n\t" 78 79 "jmp .protect_puts_loop2\n\t" 80 81 82 ".endd:\n\t" 83 84 85 : "=m" (byte_count), 86 "=m" (font_address), 87 "=m" (vram_address) 88 89 : "m" (byte_count), 90 "m" (font_address), 91 "m" (vram_address), 92 "m" (ptrr), 93 "m" (yoko), 94 "m" (tate) 95 ); 96 97 } 98

protect_putsを単体で呼び出したときは
画面に abcdefghijkが正常に表示されますが

c

1void main_kernel(){ 2 char ptr[] = "abcdefghigk"; 3 char *a = ptr; 4 protect_puts(a,11,5,5); 5}

aaa関数の中でprotect_putsを呼び出すようにし、
aaa関数を呼び出しましたが
なにも表示されません。

c

1#include <stdio.h> 2 3 void test_sample(void); 4 5void main(void){ 6 test_sample(); 7} 8 9void test_sample(void){ 10printf("%d",5); 11} 12

こちらで一応試しましたが関数の中で関数は呼び出せますよね?

うまく動かない原因として何があるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

もし、
「関数の中で関数を定義したい」だったらCでは出来ませんで終わりだけれど。
「関数の中で関数を宣言したい」だったら、そのプログラムで出来てますよね。

わけあってどうしても関数の中で関数を呼び出さなければいけないのですが・・・

普通にCでは関数の中で関数を呼び出すでしょう...それ以外の方法でどうやってCのプログラムを組もうというのでしょう?

何か勘違いしている?

C

1void main_kernel(){ 2void aaa(); //型名 関数名(引数リスト:無記入) ; これは関数のプロトタイプ宣言 3}

宣言して、そういう関数がどこかにあるよ、とコンパイラに教えただけです。宣言しただけでは関数は実行されません。

投稿2020/03/20 09:09

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2020/03/20 09:13

カーネル(?)を作成していてmain_kernel関数からプログラムが始まるように設定しています。 (ブートローダーが終わったら main_kernel関数から処理が始まるように仕向けています。)
guest

0

ベストアンサー

C

1void main_kernel(){ 2void aaa(); 3}

じゃなく、

C

1void main_kernel(){ 2 aaa(); 3}

投稿2020/03/20 08:59

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2020/03/20 09:07

できました 大変失礼しました。。。 すみません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問