このスレッドは天才チンパンジー「アイちゃん」が C言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。
Cは配列を返す事はできないがどんな物であれ配列へのポインタを返す事はできる #include <stdio.h> int (*func(int (*a)[10]))[10] { return a; } int main() { int i, j; int a[2][10], (*b)[10]; for (i = 0; i < 2; i++) for (j = 0; j < 10; j++) a[i][j] = i * 10 + j; b = func(a); for (i = 0; i < 2; i++) { for (j = 0; j < 10; j++) printf(" %2d ", b[i][j]); putchar('\n'); } return 0; }
ところで、(入門篇)じゃないC言語なら俺に聞けスレはどこへ行ったの?
7 :
デフォルトの名無しさん :2008/10/15(水) 10:22:12
mallocで確保した3次元配列(もどき)を関数に渡したいんですけど Warningが消えません。どこを修正すればよいのでしょうか? void Kansu(int *Array[10][5]); int main(void) { int *Array = malloc(sizeof(int) * 20 * 10 * 5); Kansu(Array); return 0; } void Kansu(int *Array[10][5]) { Array[1][1][1] = 1; }
8 :
デフォルトの名無しさん :2008/10/15(水) 10:33:26
↑ちなみにCygwinです。
void Kansu(int (*Array)[10][5]); int (*Array)[10][5] = (int (*)[10][5])malloc(sizeof(int) * 20 * 10 * 5); とかでどうか?
10 :
デフォルトの名無しさん :2008/10/15(水) 11:47:43
>>9 ありがとうございます。
エラーは回避できました。
しかし、その方法だと、もしArray宣言時に[10][5]の部分が[10億][5億]とかだと
スタック領域が足りなくなってしまわないですか?
ペタを超えてエクサバイト確保するつもりですか 64bitには収まるだろうが…
やってみろよ
13 :
デフォルトの名無しさん :2008/10/15(水) 11:57:43
[10億][5億]は言い過ぎですが、 ヒープ領域より小さくかつスタック領域より大きい、そんなサイズを今の研究で扱っています。
そうじゃねーよ、int (*Array)[10][5] は普通のポインタだよ。32bit環境なら4バイトしか食わんだろ。
15 :
デフォルトの名無しさん :2008/10/15(水) 12:07:12
>>14 あ、すいません。
4byteでした・・・私の勘違いでしたm(__)mペコ
16 :
デフォルトの名無しさん :2008/10/15(水) 12:17:52
テラバイトの確保できる方法あるよ 仮想記憶の方法をつかう
17 :
デフォルトの名無しさん :2008/10/15(水) 12:38:28
最近はスーパーコンピウタを扱える研究者や学生(!)も増えてきたし ありえないことはない
わたしは6月に会社を作った者です。 求人はもっぱらハローワークを使っているのですが、 6月には五十代後半の方からしか応募がありませんでした。 ところが今は四十代後半の方からも応募があります。 この点は不況がチャンスになっています。 弊社は現在、応募された全ての方を有期間契約社員として、 案件が見つかり次第契約をさせて頂いています。 (案件がなかなか見つからないことも考えられるので、 弊社の場合、他社との並行営業をOKにしています。) その危惧が現実になり、6月に契約が成立して9月に勤務 終了した五十代後半の方の新しい案件が決まりません。 (やはり現在も並行営業可で、数社で探されているのです が、そちらでも見つからないそうです) 現在五十代後半可の求人が極端に少なく、ごくわずかな 案件に大勢の方が集中しております。 この点は不況のデメリットだと思います。 以上わたくしの観点から駄文を書かせて頂きました
↑IT会社です
21 :
デフォルトの名無しさん :2008/10/15(水) 14:51:20
C言語の勉強をしようと思って独習Cと言う本を買ったんですが、 よくわからなくて、 #include <stdio.h> int main (void) { printf("これはCの短いプログラムです"); return 0; } とあるのですが、インストールしたコマンドプロンプトに打ち込めばいいのですか? 打ってもコマンドの構成が違います。 となってしまいます。 誰か、教えてください。
テキストファイルを作成し、そこにソースコードを書き込んで、拡張子を.cにしてコンパイルする もう一度本を最初から読み直せ、何度でもだ
>>21 必要なもの
テキストエディタ(メモ帳でもいいけどVisualC++にも含まれる)
Cコンパイラー(Visual C++とかに含まれる)
24 :
デフォルトの名無しさん :2008/10/15(水) 15:13:12
Cコンパイラとテキストエディタが必要みたいです。 テキストエディタはメモ帳でいいのですか? Cコンパイラはダウンロードするのですか? ほんと無知ですいません。
25 :
デフォルトの名無しさん :2008/10/15(水) 15:15:53
あ 23さん ありがとうございます。
独習Cってbccついてるんじゃないの? まあ統合環境という点ではMSのがいいか。
27 :
デフォルトの名無しさん :2008/10/15(水) 15:49:55
とりあえずVisual C++をダウンロードしてます。 26さん GNU C コンパイラ付きってなってました。
独習になってないな
29 :
デフォルトの名無しさん :2008/10/15(水) 16:05:42
まず読んでください。 ソースが長いので一部だけ書きます。 // キーイベント static void KeyEvent( unsigned char key, int x, int y) { // quit if the ESC key is pressed if( key == 0x1b ) { printf("*** %f (frame/sec)\n", (double)g_frame_count/arUtilTimer()); Cleanup(); exit(0); } } これのキーイベントに方向キー上を入力するとオブジェクトが前に進めるようにしたいんですが、 このソース自体流入したものなんでどうしたらいいかわかりません。 どのようなソースにしたらいいのか教えてください。 またヘッダーファイルが新たに必要な場合はそういって下さい。
流入の意味がわかりません お前のPCは全ポート開放でもしてんのか
31 :
デフォルトの名無しさん :2008/10/15(水) 16:07:58
タイプデフされているものを無効にして新規にタイプデフする方法無いですか?
32 :
デフォルトの名無しさん :2008/10/15(水) 16:08:22
意味不明 それにESCは制御コードとしてアスキーコードに0x1bであるけど キーボードの上とかはねーよ。 まずは今使ってる環境でどうやったらキーボードの各キーコードを 取得できるかを調べたほうがいいだろ。
>>31 ない
>>29 標準外の技法に関する対応は常に標準外
環境もソースの詳細も出さずにそんなこと言われても答えられるやつはいない
35 :
デフォルトの名無しさん :2008/10/15(水) 16:11:18
>>33 日本語間違えていましたすみません。
それとその各キーコードを教えてもらえたら幸いです。
>>35 無茶をいうなよ。
お前が使ってる環境のキーボードインタフェースの仕様なんてわかるわけないだろw
>>35 1)名前欄に29と入れた上で自分の使っているOSからコンパイラから環境を全部書いたうえでその入手したソースとやらをまるっとうpる
2)帰る
好きなほうを選べ
38 :
デフォルトの名無しさん :2008/10/15(水) 16:14:36
>>34 Microsoft Visual C++ 2008です。
ソースの詳細というとソース全部はりつければいいですか?
>>38 そこまで開発環境わかってるなら余裕で調べれるだろ。
ネットに落ちてる。
第一ここで聞くことじゃないだろ。
スレタイ嫁
こないだのヘッダファイルのときと同じように、出てきた関数名とかでググったら、、 またARToolKitかよ、最近流行ってんの?
41 :
29 :2008/10/15(水) 16:23:53
>>37 1にします。
Microsoft Visual C++ 2008
OS:Windows vista Home Premium 32bit
プロセッサ:intel Core2 Quad CPU Q9550 @ 2.83GH
メモリ:2.00GB
ディスプレイアダプタ:NVIDAI GeForce
キーボード PS/2 キーボード
>>40 最近それを使ったバーチャルフィギアだっけ?
あれがでてるしな。
43 :
デフォルトの名無しさん :2008/10/15(水) 16:27:29
タイプデフを回避する方法わかりました #define string string2 として別名でタイプデフさせてから #undef string として自分でタイプデフするんです
>>42 なるほどー、そう言うのがあるのね。
>>41 それ、includeしてるのはwindows.h、glut.hどっち?
KeyEventが呼ばれた経緯にもよるけど、せっかくVC++使ってんなら
ブレークポイントでとめてどの値がきたか調べてみては。
45 :
デフォルトの名無しさん :2008/10/15(水) 16:40:34
strcpy()使わずに文字列コピー関数を自作するのは たいていどのような理由からですか?
>>41 #include <conio.h>
して
key = _getch();
if (key == 0xe0)
{
key = _getch();
if (key == 0x48)
{
// ↑キー処理
}
}
47 :
29 :2008/10/15(水) 16:43:25
>>44 #include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <AR/gsub.h>
#include <AR/video.h>
#include <AR/param.h>
#include <AR/ar.h>
#include "GLMetaseq.h"
#include "GLLight.h"
です。
両方か・・・ まあ、glut.hの中見て、GLUT_KEY_LEFTとか定義してあるから それと比べてみ。違ったらまた考えるわ。
1を選んだ割にはまるっとうpされてないな。
あと
>>43 のタイプデフがタイプデフ(笑)じゃないように見える。
51 :
デフォルトの名無しさん :2008/10/15(水) 19:14:34
21です。 なんとか独習Cを進められるようになりました。 ありがとうございました。
質問です クラスのプライベートで typedef struct { char Question[256]; // 問題 char Select[256]; // 選択肢 int Answer; // 答え } Question, *Quiz; }; を定義して デフォルトコンストラクタで Quiz = new Question[MAX_QUIZ]; とやったのですが : error C2513: 'QuizClass::Question *' : 指定された型は、識別子の名前を指定せずに宣言されています と出てしまいます どうすればメモリを確保できますか? ヒントだけでもいいのでよろしくお願いします。
スレタイよめ
ごめんなさい C++いってきます
55 :
デフォルトの名無しさん :2008/10/15(水) 20:10:28
質問です C言語で"|"(縦線)にはどんな効果があるんですか?
ビット演算のOR
57 :
デフォルトの名無しさん :2008/10/15(水) 20:16:36
ありがとうございます
58 :
デフォルトの名無しさん :2008/10/15(水) 20:53:06
自分の学籍番号,氏名をキーボードから入力し, 画面に表示するプログラムを文字型配列を用いて作成せよ
宿題スレでどうぞ
61 :
デフォルトの名無しさん :2008/10/15(水) 22:30:48
#include <stdio.h> void nullpo(int *afo) { afo = NULL; } int main(void) { int *baka; nullpo(baka); *baka = 1; return(0); }
62 :
デフォルトの名無しさん :2008/10/15(水) 22:36:42
63 :
ののし :2008/10/15(水) 22:42:47
唐突ですが。 ポインタについて、少し不安なのですが、これって良い使い方ですか? WIN APIですが、VC++ ↓ ----一部関数---------------- void bit2(HWND hWnd)////裏画面から表画面 { HDC hdc;HDC *hd;////ポインタ hdc=GetDC(hWnd); hd=&hdc; BitBlt(*hd,0,0,599,479,bhDC,0,0,SRCCOPY); ReleaseDC(hWnd,hdc); }
何のためにポインタ使ってるのかが分からない
65 :
デフォルトの名無しさん :2008/10/15(水) 23:26:47
c言語ではwavなどのデータを読み込まずに音階を鳴らせますか?
>>65 開発環境も書かずに・・・
最近のゲーム機はwavなんかのデータを鳴らせるけど
その昔の音源は音階を与えて鳴らしてたりしてたよ。
BEEP音なんて原始的なのもあるけど。
つまりデバイスが無いとどうしようもありません。
C言語以前のお話
67 :
Cの達人 :2008/10/16(木) 03:32:39
こんばんは。 私、周りの人々から"Cの達人"と呼ばれております。 "Cの達人"をご用命の方、お待ちしております。 Caution : 暇人ではないので、いつ現れるかお約束できません。 神出鬼没の、"Cの達人"とでも呼んでください。
68 :
デフォルトの名無しさん :2008/10/16(木) 05:38:21
メモリ2045MBのWinXPパソコンでも、メモリ6GBのWinXP64bitパソコンでもメモリの確保ができません。コンパイラはCygwinです。 SIZE1を6000、SIZE2を2000まで減らすと確保できるのですが、それじゃ意味無いのでSIZE1は40000くらい欲しいです。 (intの4Bytes*6401*9401*6 = 1,444,219,224Bytes = 1,5GB以下のメモリしか使用していない) mallocはヒープ領域だから、メインメモリのある限り確保できると思ったんですが・・・ #include <stdio.h> #include <stdlib.h> #define SIZE1 6400 #define SIZE2 3000 int main(void) { int (*Edge1)[SIZE1+SIZE2+1][5+1]; Edge1 = (int (*)[SIZE1+SIZE2+1][5+1])malloc(sizeof(int) * (SIZE1+1) * (SIZE1+SIZE2+1) * (5+1)); if (Edge1==NULL) { printf("Edge1=%p\n", Edge1); fprintf(stderr, "メモリエラー\n"); } return 0; }
>>68 何も実行して無くても裏でいっぱいプロセス動いてるからね
タスクマネージャーで空きメモリとか見てみたら
おまいらの知ってる最強の命名規則おしえて!
NOP
YPS-Yacチャートって 初めて聞きました。 調べたら富士通の開発ツールのようですね。 (各メーカーそれぞれ独自の開発環境を整備しているので) いずれにしても、特定メーカーや特定ツールによる開発環境は、訓練すればすぐに 使いこなせるようになるので、あまり条件とかにはしませんね。 初級者はよく気にしますが。 愚かです
fputcとfgetcってfprintfとfscanfがあるのに必要あるんですか それとも両方覚えたほうがいいでしょうか
必要ないのはgetsくらいなもんでないの
あいや、getsも状況が許されるなら使い道あるか
速度はどっちがいいんだろうね
fprintfやfscanfは複雑な書式文字列の解析処理をやらねばならんのだから、 1バイトずつ入出力したい場合はfputcやfgetcの方が単純な分軽いと思うよ
79 :
デフォルトの名無しさん :2008/10/16(木) 14:23:47
スマソ。色々本読んでたら、混乱してきた。。 グローバル変数を分割されたファイルで使用するためのexport宣言でこんがらがっています。 2つのCソースファイルがあり、main関数のあるファイルでグローバル変数を宣言したとすると、main関数でexport宣言するのか もう一方のファイルでexport宣言するのかどっちですか?頭がこんがらがっているので、シンプルにお願いします。
×export ○extern 結局どっちでも動くので好みで選べ どこか一箇所だけextern無しで宣言し、他は全部extern付きで宣言する extern無しで宣言したところに実体ができ、extern付きの方から参照される
>>79 必要なファイルに全部extern書いとけ
で、どれか1個だけ消すか重複でexternなしを宣言してもいい
char* Test() { char str[] = "テスト"; return str; } こういうことをした時、strの中身がいつまで残っているかというのは決まっているのですか? strcpy(string, Test()); これだと今のところ何も問題はないのですが、 自作関数のネストで何度もstrを渡しているとたまにstrの中身が欠けていることがありました。
決まってる その関数を抜けるまでw
char tes[64];
strcpy(tes, Test());
printf("%s", tes); //正常
printf("%s", Test()); //アウト
この違いは何故ですか?
Test()は
>>82 です
>>84 × printf("%s", tes); //正常
○ printf("%s", tes); //正常に動いているように見えることがある
>>85 strcpy(tes, Test()); も上手く動かない事があるんですか?
よく分からないです。
とりあえずstatic付けとくことにします。
大抵はローカル変数はスタック使う 関数から戻ったあと、ローカル変数宣言したり関数呼んだりスタック使う事やったら 中身変わる 変わってなかったとしてもたまたま
Testから戻った時点で、strはもう壊れていると考えるべき
>>86 たいていの場合においてうまく動くだろうと思うよ。
ただ、常にうまく動く保証はない。
きっと爆発しないはずの爆弾なので気にせずインテリアとしておいてますって感じ。
>>68 >> Edge1 = (int (*)[SIZE1+SIZE2+1][5+1])malloc(sizeof(int) * (SIZE1+1) * (SIZE1+SIZE2+1) * (5+1));
malloc()内での 「* (SIZE1+1)」の必要性は?
2次元配列の各要素に長さが高々SIZE1であるような文字列の先頭アドレスを入れたいんでないの
ってintだったか。まあ、でも、そういうことじゃないの。
>>79 メイン関数のあるソースファイルに対応するヘッダファイルを作ってそこにextern宣言を書き
そのヘッダファイルをもう一方のソースファイルで#includeする
== main.c == int g; main() { : : == main.h == #ifndef MAINH #define MAINH extern int g; : : #endif == sub.c == #include "main.h" : :
場合によっては
>>82 のstrにstaticを付けるだけで問題解決ということもある。
初歩的な質問なんですが 初期化が必要な変数の初期値ってどんな数を代入すればいいんですか?
>>98 場合によるという回答で十分です、助かりました
ありがとうございました
void Strcat(char *s1, const char *s2) { while(*s1++ != '\0') ; while(*s2 != '\0') *s1++ = *s2++; *s1 = '\0'; } s2をs1の後ろに連結させたいのですが、うまく動いてくれません>< 何故でしょうか?
>>100 最初のwhileを抜けたあとにs1はどこを指しているか。
あー……ヌル文字の次ですねorz while(*s1 != '\0') s1++; これじゃないと駄目ですね、ありがとうございました!
while(*++s1);
sprintfで必要なバッファの長さを計算する方法は無い?
sprintfと同じことを空処理して数える関数書けば
エアsprintf
107 :
デフォルトの名無しさん :2008/10/16(木) 22:05:03
>>104 FILE *fp = fopen("/dev/null", "w");
int buffer_length = fprintf(fp, "hogehoge");
108 :
91 :2008/10/16(木) 22:09:34
>>92-93 言っていることが意味不明だ。
>>68 のやりたいことも意味不明だが・・・
そもそもなぜ二次元配列なの?
>int (*Edge1)[SIZE1+SIZE2+1][5+1];
の[5+1]はどのような意味をもっているんだ?
もうひとつ、配列要素数になぜ1を足すんだ?
取りあえず、
>>68 を書き換えてみると、
=============================================================================
#include <stdio.h>
#include <stdlib.h>
#define SIZE1 6400
#define SIZE2 3000
int main(void)
{
int (*p)[SIZE1+SIZE2][5+1];
if((p=(int (*)[SIZE1+SIZE2][5+1])malloc(sizeof(int)*(SIZE1+SIZE2)*(5+1))==NULL){
fprintf(stderr, "メモリエラー\n");
exit(1);
}
printf("p=%p\n", p);
return 0;
}
=============================================================================
これでいいんじゃないの?
109 :
デフォルトの名無しさん :2008/10/16(木) 22:40:03
UNIX Cで、子プロセスを起動したいんですが、どうすればいいんでしょうか?
110 :
デフォルトの名無しさん :2008/10/16(木) 22:41:19
ぐぐれ
111 :
デフォルトの名無しさん :2008/10/16(木) 22:41:44
>>104 (
>>106 が逝ってることを翻訳すると)環境依存だが、
asprintf+strlen+free
>>104 C99ならsnprintfで1番目の引数をNULLにすればいい。
ほかにはVCなら_scprintfという関数がある。
114 :
デフォルトの名無しさん :2008/10/16(木) 22:49:00
fork使えカス
C言語全くの初心者です。 勉強するのにおすすめの書籍やサイトはありますか? また、ある程度プログラムを組めるようになるまでどのくらいかかりますか?
116 :
デフォルトの名無しさん :2008/10/16(木) 22:50:19
>>109 signal sigaction setpgrp
pipe dup2 socketpair
waitpid
なども知っているとより安心。
特に、waitは忘れずに。
118 :
デフォルトの名無しさん :2008/10/16(木) 22:54:25
>>113 ありがとうございます。
ググってみたんですが、forkと、execの違いがよく分かりません。
親プロセスの性能を落としたくないので、新たに子プロを作成し、別処理を
行わせたく、親も子も、常駐プロセスにしたいのですが、その場合はどちらが
いいんでしょうか?
119 :
115 :2008/10/16(木) 23:17:14
>>118 forkは元プロセスを複製することで新しいプロセスを作る
execはその新しいプロセスに別のプログラムをロードする
これ以上はスレ違い
121 :
デフォルトの名無しさん :2008/10/16(木) 23:25:38
>>120 そうなんですね。じゃあ、execですね。ありがとうございます。
しかもスレ違いなんですね。失礼しました!UNIX板とかに行くべきですかね。
>>118 子プロセス作るのはfork。
プロセスに、他の実行ファイルのプログラムを実行させるのがexec。
子プロセスが行う処理も親プロセスが行う処理も
一緒の1つのプログラムに記述するならforkだけで良い。
でもそういう場合はスレッド使うことのが多い気がする。
が、なんかこの辺て環境依存スレのがいい気がする。
>>118 fork 自分の分身の子プロセスを作る。スタック、レジスタは親プロセスのものを引き継ぐ。
子プロセスの実行はforkの次から。
exec プロセスに別の実行ファイルのコードをかぶせる。実行はかぶせたコードの先頭から開始。
自分の分身の子プロセスを作るだけならforkだけ。
別の実行ファイルの子プロセスを作るならfork->exec。
execはプロセスを作ることはしない。
124 :
デフォルトの名無しさん :2008/10/16(木) 23:39:48
>>117 少し前に独習Cで独習してたけど、ぜんぜん独習になってない奴がいなかったっけ?
125 :
デフォルトの名無しさん :2008/10/16(木) 23:45:01
double data[50][300] ぐらいの領域って楽勝に確保できますかね?
環境による。 PC上の話で再帰する関数のローカル変数以外なら、大体大丈夫。
_scprintfでできましたー
DEBUGが定義されていないと 実行しない(引数受け渡しも)関数はどう書きます?
こんなんでいいんじゃないの? #ifdef DEBUG void hoge(int i, char const *s) #else #define hoge(i, s) #endif 普通はNDEBUGが定義されているかどうかを使うことのほうが多いと思うけど。
関数ぬるぽに置換とか
_noop
>>103 char buf[256] = {0};
Strcat(buf, "hoge");
s1が空文字列だとだめ
void Strins(char *s1, int idx, const char *s2) { int i; char *temp; for(i = 0; i < idx; i++, *s1++) ; temp = s1; printf("temp = %s\n", temp); while(*s2 != '\0') *s1++ = *s2++; s1 = temp; } idx = 7 s2 = XYZ とします。すると s1 = ABFABxyzAB1234 temp = zAB1234 s1 の 7 文字目の前に "XYZ" を挿入すると --> ABFABxyXYZ1234 ……zABが消えてしまいます。何故でしょうか?
>>133 >*s1++ = *s2++;
s1の位置にs2を上書きしてるだけで挿入していない
挿入にするには先にzAB1234を3文字分後ろに移動させなければならない
>>134 いい加減なこと書くな
>>133 そのコード、意味不明な部分多すぎ。
ポインタを全く理解できていない。
「*s1++」は、char *s1というポインタが指す1バイト目の文字に1を足しているだけ。
ポインタをずらすには、「s1++」とする。
ポインタの概念を一から勉強しなおすべきだと思うよ。
ひょっとしてそれはギャグで(ry
137 :
デフォルトの名無しさん :2008/10/17(金) 16:21:27
> 「*s1++」は、char *s1というポインタが指す1バイト目の文字に1を足しているだけ。 > 「*s1++」は、char *s1というポインタが指す1バイト目の文字に1を足しているだけ。 > 「*s1++」は、char *s1というポインタが指す1バイト目の文字に1を足しているだけ。 > 「*s1++」は、char *s1というポインタが指す1バイト目の文字に1を足しているだけ。 > 「*s1++」は、char *s1というポインタが指す1バイト目の文字に1を足しているだけ。
*s1++でポインタの値がインクリメントされてからアドレス参照されなかったっけ? あれ?俺の記憶違い?優先順位では後置インクリメントの方が強くなかったか?
優先順位は同じ 結合方向の問題
142 :
140 :2008/10/17(金) 16:28:37
優先順位は同じなのか、きちんと覚えておこう 優先順位が結構曖昧だからなぁ俺
後置インクリメントのほうが優先順位高い 前置と間接演算子が同じ
>>108 1を足すのは番兵でもいれるんじゃないの?
まあ本人がレスしないことには何したいのかさっぱりなのは同じだけど。
145 :
133 :2008/10/17(金) 17:26:26
すみません>< 正直授業がよく解らなかったというか、明らかに説明不s(ry void Strins(char *s1, int idx, const char *s2) { int i, count = 0; char temp[100]; for(i = 0; i < idx; i++, *s1++) ; for(i = 0; *s1 != '\0'; i++){ temp[i] = *s1++; count++; } temp[i] = '\0'; for(i = 0; i < count; i++, s1--) ; while(*s2 != '\0') *s1++ = *s2++; for(i = 0; temp[i] != '\0';i++) *s1++ = temp[i]; } とりあえず、あれから考えてこれで動いてくれましたが……。 配列に隙間を作るという動作がどうしても解りません><
積木でも使って考えてみては。 隙間というより、後ろにコピーしてやればコピー元は上書きできるよね。
147 :
135 :2008/10/17(金) 17:50:09
お前ら、
>>135 氏を責めてやるな。彼は出かけで急いでいたのでちょいミスしただけだ。
少なくとも、お前らクソガキとは違って、彼はプロなんだから。
業界でも一目置かれているんだそうだ。本人が言うからには間違いないだろう。
> 「*s1++」は、char *s1というポインタが指す1バイト目の文字に1を足しているだけ。
こんなことが間違いだと言ふことは、学坊でもわかるだろ? 常識中の常識だ!
つまらん事で責めるのは学坊の悪い癖だと、プロフェッショナルな
>>135 氏が言うのだから間違いない。
以上
すまん・・・ プロフェッショナルな俺様がアホなことを書いてしまった・・・
たぶんある筈の無い括弧が見えていたんだろう。
149 :
133 :2008/10/17(金) 17:55:42
>>146 それをずっと考えてたんですけど、なかなかうまくいかなくて><
>>133 の書き込みじゃ、何がしたいのかサッパリだったが。
>>145 本棚s1の本を左からidx冊抜いて、そこに本棚s2の本を突っ込むのに
「idx+1冊目から一冊ずつ別の棚(temp)に移動して、
本棚s2の中身を一冊ずつ持ってきて、
別の棚tempに逃がした本を戻す」
ということをしたかったのか。
>for(i = 0; i < idx; i++, *s1++)
>;
s1 += idx;
でいいやん。
>for(i = 0; i < count; i++, s1--)
>;
s1 -= count;
でいいやん。
>>133 substrで前後分割して、前、s2、後の順にstrcatしてみるとか
memmoveで隙間を空けてそこにmemcpyするとか
いずれにせよバッファオーバーしないように気をつけて。
152 :
133 :2008/10/17(金) 18:15:00
>>150 おお、いけた……。
すみません、
s1 += idx;
と
*s1 += idx;
の違いってなんですかね?><
>>151 関数駆使する手もあるんですな……。
>>152 なんですかねって*演算子の意味はわかってる?
なんだ、str系とmem系は勉強のためにあえて外してるのかと思った
155 :
133 :2008/10/17(金) 18:32:10
>>152 正直、解ってないと思います。
*aはa[0]と同じ意味で、aは&a[0](アドレス?)ですよね?
この2つの違いがよく解らない感じです。
>>154 strcatは今回作成したんですけど、他の関数はまだ習ってません><
小池さんちに小池さんがいるかもしれないし、Q太郎がいるかもしれないってことだ
>>155 ポインタについて説明してる本やサイトを見たほうがいい
まったく理解できてない
>>157 すみません、あほなこと聞いてましたね><
>>152 の前者はアドレス移動、後者は*s1の中身にidxを足すってことかー。
*s1++
途中で途切れてしまったorz *s1++でアドレスを移動できるのは、なぜなんでしょうか?><
*s1++ は、 s1++ して *s1 だから(後置だからインクリメントする前のアドレスだけど) (*s1)++ これだと値のほうをインクリメント
>>160 なるほど、やっと理解できました。
ありがとうございました。
>>161 s1の中身ですよねorz
書き込んでから気づきました……。
s1はポインタ *s1はs1[0]と考えればいい とにかく君は、ポインタを全く理解できていないので、もう一度勉強しなおすべきだよ
165 :
デフォルトの名無しさん :2008/10/17(金) 20:20:44
独習Cという本を買ったのですが今いちよくわかりませんので教えてください。 printfってなんですか?
教えてください。 独習ってなんですか?
169 :
79 :2008/10/17(金) 21:31:20
>>80 どっちでもうごくんですね。ありがたいです。extern宣言無しのところで実態ができ
他のextern宣言したところは参照用というのがすごく勉強になりました。ありがとうございました。
>>81 重複してextern無しと有を1つのファイルに書くという方法もできるんですね。
Cの文法は覚えるのが多いですね。その分楽しいという面もありますが。
初心者のうちは必要なファイルに全部書いておくのも手なんですね。どうもありがたい
ご助言ありがとうございました。
>>94 どうもありがとうございます。私の本にもその方法が載っていました。昨日は忙しくて
プログラムをする暇が無かったのですが、今日、
みなさんのご回答を読んで本に書いてあること(
>>94 さんのいうこと)の意味がわかりました。
どうも、的を得て書いていただいて感謝しています。本だけでは解決できませんでした。
その94さんの方法が一番オーソドックスみたいですね。これからそれでいきます。
みなさん、ありがとうございました。また、お礼が遅れて済みませんでした。
他の人が作ったプログラムを見ていて -= という部分が出てきて、これが何なのかわかりません。 ググろうにもいまいち調べられなくて・・・ これはどういった意味を持っているんでしょうか
a = a - 5; は a -= 5; とも書けます
172 :
デフォルトの名無しさん :2008/10/17(金) 23:38:45
voidってなんですか?
173 :
デフォルトの名無しさん :2008/10/17(金) 23:47:48
174 :
デフォルトの名無しさん :2008/10/17(金) 23:56:53
atoiは何に使うのでしょうか?
>>176 ASCII to integer だろ・・・
178 :
デフォルトの名無しさん :2008/10/18(土) 00:42:43
ヘ_ヘ ミ・・ ミ ( )〜
アとイ C言語の覚えはじめの頃はそう読んでました。
180 :
176 :2008/10/18(土) 02:18:33
ぶほ。 ほんとごめんぬ。
限定だろ
>>170 「C 演算子」辺りでひっかかると思うよ
便利なのが色々あるから一通り見とくといいかも
>>176 >>181 数字のASCIIコードの変換が主な目的で
多次元のarrayは途中で読まなくなる可能性があるから
ASCII string to integerが元の正しい意味っぽい
atokは Awa TOKushima
ポインタ初心者は四角と矢印の絵をいちいち紙に書きながらプログラミングしてみなさい そのうち紙がいらなくなるから
// 文字数を取得 int GetLength( const char *s ) { int iCount = 0; while( s[ iCount ] != '\0' ) iCount++; return iCount; } // 任意の位置に文字を挿入 void Strins( char *s1, int idx, const char *s2 ) { int iInsLen = GetLength( s2 ); int iMstLen = GetLength( s1 ); for( int i = iMstLen; i >= idx; i-- ) { s1[ iInsLen + i ] = s1[ i ]; } for ( int i = 0; i < iInsLen; i++ ) { s1[ idx + i ] = s2[ i ]; } } なんとなく書いてみた。コンパイラ通してない。多分色々間違ってる。 str、mem系を使わずに実装するとして、もっとエレガントになりそうな気も。
188 :
デフォルトの名無しさん :2008/10/18(土) 11:19:40
> str、mem系を使わずに実装するとして、 最高におげふぃんだと思うが
エレガントとかいうよりただの愚直な実装だろ
Awa TOKushima ってマジだったんかよw
>>187 あんたって、しょうもない関数作っては他のプロジェクトメンバーに無理やり使わせたがるタイプだろ。
そうじゃなくて、ライブラリを使うことがあんまり好きじゃないなって思う時期なんだろ。 インクルードファイルが増えるとサイズがでかくなるし!とか思う頃。
193 :
187 :2008/10/18(土) 15:10:12
あら。誰もプログラム遊びには付き合ってくれないのか。残念。
>>191 そんな時期もありました。資産共有、とか掲げてオレオレ仕様の自称便利関数
を大量に作り、自分が予想した使い方以外のテストはせずにトリッキーな高速化。
可読性を捨てたのにメンテナンスせず、「中身のぞいてね♪」みたいな。
>>192 そんな時期もありました。stlやboost憶えるのが億劫で
自分のやり方押し通す為の言い訳を一生懸命考える、みたいな。
strcpyってなんですか?
strlen()自作するのがなんか意味あるのか。
196 :
187 :2008/10/18(土) 15:50:23
>>195 何かスレを見てる感じでは学校の課題か何かかなと。
で、教わってない関数とか使うと怒られたりするのかなぁと。
いや、まぁ全部仮定なんだけど。
str系を使ったら
char tmp = s1[ idx - 1 ];
s1[ idx - 1 ] = '\0';
sprintf(s1,"%s%c%s%s", s1, tmp, s2, &s1[ idx ]);
こんな感じ?idx=0 or sprintfの実装によっては死ぬけど。
恥の上塗りしなくても
198 :
187 :2008/10/18(土) 15:56:42
sprintf(&s1[idx], "%s%s", s2, &s1[idx]); こうか。
void Strins( char *s1, int idx, const char *s2 ) { int s1_len; s1_len=strlen(s1); s2_len=strlen(s2); if(idx<0) idx=0; if(idx>s1_len) idx=s1_len; memmove(&s1[idx+s2_len], &s1[idx], s1_len-idx+1); memcpy(&s1[idx], s2, s2_len); }
200 :
187 :2008/10/18(土) 16:03:00
>>197 自分としては恥かいたけど、ちょっと学習したので良しとしたいw
すれ汚しスマソ。
何か満足したので名無しに戻るっす。
>>198 それがちゃんと動く環境があるんだ?
そうだとすると、やっぱりmemmoveを使った方が速そうだなあ。
202 :
187 :2008/10/18(土) 16:52:34
>>201 かなりあてずっぽ。
今、試しにVC2008でやってみたらダメだった。残念。orz
203 :
デフォルトの名無しさん :2008/10/18(土) 17:08:08
林晴彦の「応用C言語」っていうの買ってきて コンソールプログラムの応用例がかいてあるんだけど、 エスケープシーケンスとか多用してるんだけど、WinXPじゃたしかだめなんだよね・・ 1980円そんした。。家にあるWin98の古ノートPCでやるか。。
林じゃなくて三田じゃいの? > 応用
XPでもANSI.SYSを入れれば16bitコンパイラを使ってるかぎり動くだろ
206 :
203 :2008/10/18(土) 17:16:45
ごめん。↓この本だよ。 「C言語入門 応用編」 っていうやつ。 三田さんのは、UNIX環境だったような。Cygwinで色々やってたけど都合が悪くてやめたんだ。 三田さんのももってるよ。Amazonのマーケットプレイスで98円とかで売ってる。
207 :
203 :2008/10/18(土) 17:17:51
>>205 まぢ?それググって調べて入れてみるよ。めちゃくちゃうれしい。
1980円無駄にならずにすんだ(;´д`)
>>193 >あら。誰もプログラム遊びには付き合ってくれないのか。残念。
結局
>>187 以上はどうしょうも無い。
209 :
デフォルトの名無しさん :2008/10/18(土) 21:01:11
#include<stdio.h>は、おまじないって本に書いてあったんですが なんのためのおまじないですか?
printf関数などを使うためのおまじない。
211 :
デフォルトの名無しさん :2008/10/18(土) 21:09:51
その本ヽ( ・∀・)ノ ウンコー
>>209 /\
/ \
/ <●> \
/ \ 666
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
___________
//TTTTTTTTTTTTTTTTTT\
/:::::/TTTTTTTTTTTTTTTTTTTTT\
/:::::::::/TTTTTTTTTTTTTTTTTTTTTTTT\
/:::::::::::::/TTTTTTTTTTTTTTTTTTTTTTTTTTT\
/:::::::::::::::::/TTTTTTTTTTTTTTTTTTTTTTTTTTTTTT\
213 :
デフォルトの名無しさん :2008/10/18(土) 21:25:11
C++使ってる奴いる?
プログラム初学者におすすめサイトのおしえてください
google
Cプログラミング診断室
初心者でも簡単にポインタがわかる本ないですか? まあ無理にとはいいませんがw
218 :
デフォルトの名無しさん :2008/10/19(日) 06:08:45
void**a; a[0] = (void*)10; a[1] = "abcd"; printf("%d\n" , a[0]); printf("%s\n" , a[1]); これって・・・領域壊してますか? それともオーケーな書き方ですか? 普通はmalloc必用ですよね、
何がやりたいのかすら意味不明 そもそも、void**なんて型は存在しない
220 :
デフォルトの名無しさん :2008/10/19(日) 06:27:21
すみません。変なことやろうとしてるんです。 mallocは必用ですね。。。 と、書き込んでからおもいまひた。
221 :
デフォルトの名無しさん :2008/10/19(日) 06:28:17
あ、でもぢれctX辺りで、void**は見たことあります。 ありがとうございました
222 :
デフォルトの名無しさん :2008/10/19(日) 07:03:26
>>217 本読むよりいろいろ実験ソース書いて動かしたほうがわかるよ
printf()使うだけでプログラムサイズが6Kbyteも増えるんだが 何でなの?
>>224 ライブラリからprintfが記述されているオブジェクトファイルごとくっついてくるからじゃね
>>224 そりゃprintfの中身が6KBあるからだ
228 :
デフォルトの名無しさん :2008/10/19(日) 12:34:13
たったあれだけの用事にいちいちmallocなんぞ使ってられるか
バカは身の程を知れw
>>271 ない。
ポインタはCの最も強力な機能のうちの一つで、同時に最も難しい問題の一つでもある。
そういうたぐいのことは、どのような手段を使ったとて「簡単に」習得できるものではない。
コツは、「ポインタは何かを指し示しており、( void * を除けば)その指し示すものの大きさも知っている」という
最も基本的な原則から始めて、ひとつひとつ理解を積み上げていくことである。
>>218 たとえ a が配列だったとしても、printf() には書式指定子で指定した型の引数を与えなければならないことを忘れてはいけない。
たまたま期待した動作が得られたとしても、それは本当にたまたまであって、正しい動作ではない。
そんなアナタにalloca
ポインターはアセンブラやれば大体の仕組みはわかるんだけどな。 あとはCコンパイラに納得させる記述がれきればOK
>>232 >あとはCコンパイラに納得させる記述がれきればOK
↑この表現、気に入った。
ポインタが難しいって言ってる人は何なの?ウルトラ警備隊なの?死ぬの?
ただCのポインタはアセンブラで扱うアドレスよりも抽象化したものだから、 そこを忘れると移植性のないコードになりがち
236 :
232 :2008/10/19(日) 13:23:04
>>233 まさしく体験談なんだけどな。
x86やってるからポインターとかは余裕だったんだけど
Cコンパイラとの対決だったわ。
あーそこはポインターなんだよ、わかれよ!!
型とかキャストとかどうでもいいからポインターなんだよ!!とね・・
>>236 無茶しすぎだからそういうことになるんだよ
自然にCの流儀で書けばそんな苦労はいらない
238 :
232 :2008/10/19(日) 13:29:33
>>237 まあその当時はまさにそのCの流儀を学んでる最中だったもんで^^;
int *a;で宣言すると*aで代入できる変数ができるっていう表現なのに箱はできないというのが合理的なような非合理的なようなで解りにくいね。
>>239 箱wwwwwwwwwwwwwwwwwwwwwwwwww
>int *a;で宣言すると*aで代入できる変数ができるっていう表現なのに ぜんぜん違います *aがint型となる変数ができる、の意味です
>>239 int *a;はint *型を代入できる箱ができるんじゃないのか?
intを入れる箱が直接欲しけりゃint a;とすればいい。
243 :
デフォルトの名無しさん :2008/10/19(日) 14:08:48
>>242 int *a;
*a=2;
!!!!!!!!!!
244 :
デフォルトの名無しさん :2008/10/19(日) 14:09:59
>>243 どっかのへっぽこポインタ記事のことですか?
つっこまれまくりな例の記事かw
248 :
デフォルトの名無しさん :2008/10/19(日) 17:10:03
rとrb、wとwbには何か違いあるんですか? 実験として下のようなプログラムを作ってみたのですが、実行結果が 0 0 0 0 1 1 1 1 ・・・ってなって違いがあるように思えないのです。 int i; FILE *fp1,*fp2,*fp3,*fp4; fp1=fopen("test1.txt","w"); fp2=fopen("test2.txt","wb"); for(i=0;i<10;i++){ fputc('0'+i,fp1); fputc('0'+i,fp2); } fclose(fp1); fclose(fp2); fp1=fopen("test1.txt","r"); fp2=fopen("test1.txt","rb"); fp3=fopen("test2.txt","r"); fp4=fopen("test2.txt","rb"); for(i=0;i<10;i++) printf("%c %c %c %c\n",fgetc(fp1),fgetc(fp2),fgetc(fp3),fgetc(fp4)); fclose(fp1); fclose(fp2); fclose(fp3); fclose(fp4);
そのbはバイナリーモード
>>248 改行が\n以外の環境で、\nに変換するかどうかの指定だろ。
>>248 処理系が対応していれば、改行文字が変わる。
fputc('\n', fp1)、fputs("\r\n", fp1)などとしてみれば判ると思うよ。
252 :
デフォルトの名無しさん :2008/10/19(日) 17:31:16
なるほど、ありがとう。 そういう違いだったのかぁ。
Unix系では差はないね
嘘いっちゃダメある
255 :
デフォルトの名無しさん :2008/10/19(日) 18:02:32
int *arg; このargの前の*は何のためにあるのですか?
int型のポインタを宣言しますとCコンパイラを納得させるため
アドレスを受け取るためにです
ど忘れしたんだけど、c言語での単語って何って言うんだっけ? キーワードじゃなくて、lispではatmっていう。 釣りじゃないよ。
259 :
デフォルトの名無しさん :2008/10/19(日) 18:21:19
260 :
デフォルトの名無しさん :2008/10/19(日) 18:21:52
2進数ってなんですか?
ある桁が2になったら桁の繰上げが起こるような数のあらわし方だよ
電球が光ってるか光ってないか
263 :
デフォルトの名無しさん :2008/10/19(日) 18:29:37
16進数ってなんですか?
10進数なんかの兄弟
265 :
258 :2008/10/19(日) 18:30:47
>>259 イジワルしないで
int a=b;
だったら、コンパイルするときにint,a,=,b,;
に分けられるだろ?
その翻訳単位。
266 :
デフォルトの名無しさん :2008/10/19(日) 18:32:13
267 :
デフォルトの名無しさん :2008/10/19(日) 18:34:35
16進数はなぜ必要なんですか?
必要だからです、エロイ人にはそれがわからんのです
269 :
デフォルトの名無しさん :2008/10/19(日) 18:36:23
まともに答えられないだけでは?w
266 もうイイ!!!! 逝ってよし!
ちょっと度忘れしたんだけど 差分のことをなんていうんだっけ? xに対するΔxのことを・・・ギャップではなくて・・・
でるた
276 :
デフォルトの名無しさん :2008/10/19(日) 20:04:22
> 16進数はなぜ必要なんですか? 逆に2進数(いうなれば 0b)がなぜ必要ないと判断されたのかが尻態 K&R になくても C90 になくてももういい、なんで C99 にもなって採用されないんだ
>>276 慣れれば16進で足りるからじゃね
C++0xのユーザ定義リテラルでも待っててください
C++でいいならboost使えばいいじゃない Cでもマクロ使えばいいじゃない
280 :
デフォルトの名無しさん :2008/10/19(日) 21:41:43
mallocって、使う時ありますか?
そんなことを聞くくらいなら、すぐに必要になることはないだろう。
malloc()禁止の会社とかあるしな。
284 :
デフォルトの名無しさん :2008/10/19(日) 22:11:04
>>278 それ言い出したら 0x もいらねーじゃん
0 だけで十分
とある本に、 char str[] = "Hello"; のような要素数省略の初期化は、大域でのみ使えて、関数の局所変数として使うには static char str[] = "Hello"; のようにstaticつけなければならないと書いてありましたが、どういうこと? 自分の記憶では、局所変数だろうとstatic無しで使えたような気がするの ですが、この本は何を意図してこう書いてあるのでしょうか。
287 :
285 :2008/10/19(日) 23:00:25
そういうことですか、どうも
288 :
デフォルトの名無しさん :2008/10/19(日) 23:43:57
typedef宣言の有効範囲について質問です。 関数内で宣言されたtypedef名の有効範囲は、その関数ブロック内であり、 ブロック(関数定義の{}以外の全ての{}で囲まれた範囲)の中で宣言されたtypedef名の有効範囲は、そのブロック内であり、 上記以外(通称、グローバル領域)で宣言されたtypedef名の有効範囲は、そのファイルスコープ内である。 という認識でよいのでしょうか。 特に知りたいのは、一番最後の有効範囲です。 例えば、foo.cとbar.cにそれぞれ、typedef Foo Foo_t;が通称、グローバル領域にあるものとする。 この場合、リンケージしたら、識別子(つまり、typedef名)が被るのではないかと思ったからです。 GCCで試したところ、問題なくリンケージできましたが、理由がわからないので、エロいひと詳しく教えてください。
ファイルパスについての質問です。 「実行ファイルを元にした相対パスを、 絶対パスにするにはどうしたらいいのでしょうか?」 相対パスを絶対パスに変換する関数は見付かったのですが、 カレントディレクトリを元にしているため、 カレントが変わると結果も変わってしまって困っています。 環境はBCCです。
>>289 bccということはWindowsだろうから、環境依存スレかAPIスレあたりへどうぞ。
環境依存せずにそういうことをする手段は、ありません。
291 :
289 :2008/10/20(月) 00:38:09
>>290 早い回答ありがとうございます。
そうなのですか、わかりました。
APIスレを覗いてこようと思います。
>>288 同じtypedefの定義が複数のファイルにあっても問題になることはない。
ファイルスコープ以上の広さを持つスコープは存在しないので、
ファイルを越えた問題になるか否かは主にリンケージの話になるが、
typedef名はリンケージを持つことがないからである。
ちなみにリンケージとはある識別子がグローバルかどうかに関わる概念であって
コンパイルしたソースどうしを結合させて一つの実効ファイルにすること(リンク)の用語ではない。
#include <stdio.h> #include <stdlib.h> int main(void) { int **array = (int**)malloc(sizeof(int*)*5); /* ポインタの配列を割り当てる */ int i, j; for(i=0; i<5; ++i) /* 配列の各列について、5要素分の領域を割り当てる */ { array[i] = (int*)malloc(sizeof(int)*5); } /* 正しく割り当てられていることを確認する */ for(i=0; i<5; ++i) /* 列 */ { for(j=0; j<5; ++j) /* 行 */ { array[i][j] = i * j; printf( "%d ", array[i][j] ); } printf( "\n" ); } for(i=0; i<5; ++i) { free( array[i] ); } free( array ); return 0; } ってのがよくわからないからフローチャートとかで教えてください。 ポインタのポインタがいまいちわかりません。
[array] └→ [array[0]][array[1]][array[2]][array[3]][array[4]] └―――┼―――┼―――┼―――┼→ [array[0][0]][array[0][1]][array[0][2]][array[0][3]][array[0][4]] └―――┼―――┼―――┼→ [array[1][0]][array[1][1]][array[1][2]][array[1][3]][array[1][4]] └―――┼―――┼→ [array[2][0]][array[2][1]][array[2][2]][array[2][3]][array[2][4]] └―――┼→ [array[3][0]][array[3][1]][array[3][2]][array[3][3]][array[3][4]] └→ [array[4][0]][array[4][1]][array[4][2]][array[4][3]][array[4][4]]
[array]ってのが何なのかよくわかりません。 すみません。
>>295 なんとなくわかりました。
ありがとうございます。
arrayは「『intへのポインタ』へのポインタ」。 一回目のmallocで割り付けられた「『intへのポインタ』の配列」の先頭を指している。 この配列の要素には、それぞれarray[0]〜attay[4]としてアクセスできる。 その配列の要素は、「intへのポインタ」。 それぞれが、ループ内のmallocで割り付けられた「intの配列」の先頭を指している。 この各int要素には、それぞれarray[0][0]〜array[4][4]としてアクセスできる。
すいません質問です。 forの練習にと思って少し書いてみたんですけれどエラーが起こるんです。 内容はこうです。 #include <stdio.h> int main() { int i,j; //繰り返しに使う for(i=0;i<5;i++) { //5回繰り返す for(j=0;j<3;j++){ printf("%d ",j); //jを0から2まで表示する } for(j=0;j<3;j++) { // printf("%d ",j+i); //j+1の結果を表示する } printf("\n"); //一旦改行 } reutrn 0; } どこをどうすれば直るんでしょうか?
エラーの内容は確認しました?
リターンの綴りがおかしい
305 :
302 :2008/10/20(月) 17:04:53
すいませんでした。 return に直すことで解決しました。
>>304 指摘しちゃだめだって。
エラー読む癖つけさせないと。
幼児にはいふくきましょうね〜ってやってるんじゃないんだから。
どうのようにふくをきればいいのですか? って質問に来たのなら答えざるを得ない
エラーには行番号も書いてあるのにね。 まあその場所しか見てなくてはまることもあるようだが。
error C2065: 'reutrn' : 定義されていない識別子です。 このエラーを自己解決できないならやめたほうがいいよ
310 :
302 :2008/10/20(月) 17:27:51
>>309 なぜかビルドの時はエラーが出なくて、実行するときになってexeが無い、
と表示されるたんです。
開発環境を伝えられるようになりましょうね
>>307 1. 無視する。
2. 罵倒する。
3. 同情する。
シングルクォートとダブルクォートの違いを教えてください。
めんどいから文字と文字列でいいよ
ダブルチーズバーガーよりチーズバーガー2個のほうがいい気がする
要素数5万ほどの 構造体配列を作りたいんですが、 構造体にstaticってつけられますか?
>>318 実際のバイト数次第?
というか付けてみればいいのは?
>>319 プログラムが動くところまで行ってないもので
そんなもんmainに書いて終了だろ
下記の簡単なコード書いて指定してみればいいんでないの? //ヘッダ書いてね //この辺か int main() { //この辺か //構造体を使う処理(ワーニング対策) return 0; }
コンパイルできましたが答えが0になりました コンパイラはborlandです #include<stdio.h> typedef struct{ double a; double b; double c; }aiueo; int main(void){ static aiueo test[50000]; test[0].a=100; printf("a=%d\n",test[0].a); return(0); }
>>318 どんなときでも宣言するオブジェクトにstaticをつけることはできるだろ
つける意味がなかったり、つけても問題が解決しなかったり、
まれにつけたせいで問題が起きたりすることはあるが
そもそもstaticをなんだと思ってるんだ
で・・・decimal
>double a >printf("a=%d\n",test[0].a);
>>325 >そもそもstaticをなんだと思ってるんだ
静的記憶領域と動的記憶領域の概念がよく分からなかったので
とりあえず大きい配列を定義するときはstaticつけとけみたいな感じにしてました
>>330 staticありにしたらコンパイル後にできあがる実行ファイルのサイズが
staticなしにくらべて増えてるから。
staticはdymanicではないということ
335 :
デフォルトの名無しさん :2008/10/20(月) 23:00:51
>>334 アーキテクチャに依るはずだけど。
最近のアークテクチャだと増えることが多いけどね。
普通は増えなさそうだけど。 VC8で、exeのサイズを見てみた。 #include <stdio.h> int main() { static int tbl[100]; for (int i = 0; i < sizeof(tbl)/sizeof(tbl[0]); i++) printf("%d\n", tbl[i]); return 0; } 7,168 バイト ---------------------------- #include <stdio.h> int main() { static int tbl[10000]; for (int i = 0; i < sizeof(tbl)/sizeof(tbl[0]); i++) printf("%d\n", tbl[i]); return 0; } 7,168 バイト ---------------------------- #include <stdio.h> int main() { for (int i = 0; i < 10; i++) printf("%d\n", i); return 0; } 7,168 バイト
とりあえず初期値をいれて再試してみないか?
初期値は0が入ってるじゃん。 0以外の初期値なら、staticじゃなくてもファイルサイズ増えるよ。
環境にも拠るが、static foo = 0;とstatic foo;とで割り当てられるセグメントが異なる場合がある。 その場合、前者は初期値も格納されるのでオブジェクトモジュールサイズが大きくなるという。
リリースビルドだと本当に初期値がないんだっけ?
あーっと、もちろんオート変数について。
>>340 ,341
リリースビルドが何かは知りませんが、自動変数は暗黙の初期値はありません。
343 :
デフォルトの名無しさん :2008/10/20(月) 23:57:59
マイクから録音した音声を波形で表示したいのですが、 WaveInで録音したものをどうやって波形にすればいいのでしょう?
>>343 ここは応用を扱うスレではありません。
応用を扱うスレ、環境依存OKスレなどへどうぞ。
>>343 スレチ
「サウンドプログラミング4」で
346 :
デフォルトの名無しさん :2008/10/21(火) 00:06:24
スレチすいません
あらほんと。 カナリヤ値を付加するスイッチがあるだけっぽい。 おさわがせしますた。
リリースビルドはVSの話です。
>>336 の話をうけて。
シミュレーション計算の進行度をパーセンテージで ターミナルに表示するようにしたいんですが どのようなコードを書けばよいのか分かりません printf(,"進度 %d\%\n",(int)((time_sim/tmax)*100.0)); 一度ターミナルに表示した文字を消す事はできますでしょうか?
\n を \r にすれば近いことはできる
>>350 おおっできました
どうもありがとうございます。
あと、printf で % 出したいときは %% な
353 :
デフォルトの名無しさん :2008/10/21(火) 21:39:21
三次元配列って難しそうですけど、どんな時使いますか?
めったに使いません。
3次元配列が必要なとき使います
最後に使ったのはいつだったか、もうおぼえていません。
357 :
デフォルトの名無しさん :2008/10/21(火) 22:17:00
for( i=num, j=0 ; k<50 ; i++,j++){ } みたいな書き方したいんですが、できませんよね? 2つの変数をループ開始時に初期化したいんですよね
できるよ
どうすればいいんですか? 上のkはjの間違いです・・・
>>360 どうするもこうするも、そのままだがね。
あれ、できました。 コンパイルがさっきとおらなかったので・・ すいません
俺には配列自体が難しい そもそもarrayが読めない
366 :
353 :2008/10/21(火) 22:48:40
367 :
デフォルトの名無しさん :2008/10/21(火) 23:03:06
> 三次元よりは使いやすい どんな点がか、よろしければお聞かせ願いたい
>>366 必要に応じて出てくるもんだけどな。
例えば方眼紙の1マスに文字列が書かれている状態を表現するとか。
それが複数枚あってノートになるし、それが複数冊あるとかさ。
もっとわかりやすいデータ構造があるだろ
370 :
デフォルトの名無しさん :2008/10/21(火) 23:18:30
ワークブックとかか? 3次元配列ごときで何とかなるなら諸手を挙げて喜びたい場面だが
ボクセルデータとか?
372 :
353 :2008/10/21(火) 23:24:18
>>367 単純に三つ目の[]が無くてすむからデータの位置が分かりやすいと思っただけでした。深くは知りません、すいません。
>>368 それ分かり安いですね、ありがとうございます。
macのターミナルでコンパイルするコマンド教えて
% gcc -c hoge.c
375 :
デフォルトの名無しさん :2008/10/21(火) 23:43:30
初期化/終了作業をするにはどうすればいいんでしょうか? ユーザーに呼び出してもらうしかないですか? Delphiにはinitialization/finalization節があったのでよかったんですが・・・
1.0 6.7 ・・・ ・ ・ ・ のようなテキストファイルを fscanf(fp,"%lf",&tmp[i]);で読み込んでいます。 もしある行に↑があったらその行を飛ばして次の行にいきたいんですが、どうすればよいですか?
>>376 Cに暗黙に呼び出されるコンストラクタやデストラクタはない
>>377 fscanfはきっちりとフォーマットの決まったデータを読むのに最適にできているので、
そういう不定なファイルを解釈するのには向かない
一行ずつfgetsで読み込んでstrtokやstrtod(atof)を使って頭から読んで行くこと
while(){ for(){ if(条件) break; } } このbreakはfor文から抜けますか?それともwhileからも抜けますか?
for
>>380 わかりました
if(fscanf(fp, "%lf", &tmp[i]) != 1)
これってどういう意味でしょうか?
384 :
デフォルトの名無しさん :2008/10/22(水) 00:37:24
また今日も scanf 自演か 飽きもせずご苦労なこったな
自演じゃないです
>>377 fgets()してfscanf()で事が足りる状況なら、間違ってもstrtok()なんて使わないように。
>>383 sscanf
戻り値, EOF:エラーもしくは、ファイル終端それ以外:読み込んだ項目数
390 :
デフォルトの名無しさん :2008/10/22(水) 06:24:08
(Fuckintosh*) *FuckOSX ) != 何たらかんたら っていうのがあったのですが これはどういう意味ですか
>>389 使いこなしがscanf()系より難しいし、環境によってはマルチスレッドで使えない。
2回目以降呼び出すとき第1引数がNULLになるのがあまり好きじゃない strtok
2つの数値を引き算をするプログラムを教えてください。
>>394 int main()
{
int a = 1;
int b = 2;
int x = a - b;
return 0;
}
>>390 int **p;
((void*)*p) != hoge)
適当だけどこういうことじゃないの?
それだけじゃわかんね
397 :
デフォルトの名無しさん :2008/10/22(水) 11:30:00
オブジェクト形式マクロを用いたNUMBER人の点数を配列tensuに 読込み,秀(90〜100点),優(80〜89点),良(70〜79点),可(60 〜69点),不可(0〜59点),判定不能(0未満あるいは100点より 上)の人数を,それぞれ変数a,b,c,d,e,fに格納・表示し,更に最高 点,最低点,合計点,平均点を表示するプログラムを作成せよ.た だし,最高点,最低点,合計点,平均点の計算において,判定不能 の点数は除外すること. なおNUMBERの値は10とし,平均点は小数点以下第2位まで表示 すること. という問題誰か教えてください。
*が前に来ればポインタか乗算 しかし*が後に来るってのがわかんらんとです
具体例を
>>399 >>390 のことでいいんだよな。
(Fuckintosh*) *FuckOSX ) != 何たらかんたら
ファックOSXがポインタ変数でそれの指す中身をファッキントッシュのポインタ型にキャストしてなんたらかんたらと比較してる。
>>167 遅レスだが、 独習 = ドイツに留学して学ぶこと
>>239 参照するint変数の実体があってもなくても、先にポインタ変数の宣言と確保ができるからね。
ポインタ変数の宣言・確保のコーディング規則も本当は
int *a;
じゃなくて
int* a;
としたかったらしいんだけど、言語仕様がルーズなまま厳格化を待たずに拡張、さらにK&R、
そして三田氏によって、いい加減なままの普及で広まっちゃったからね。
その後のANSI化と拡張、C++拡張でさらに泥沼化。これがJavaとC#を生むきっかけに・・・。
必要ならtypedefすればいいだけだから大して困らないけどね
実体なしでポインタが作れるのは短所ではないだろ
便利だよな
doubleとchar[10]の2つのメンバーからなる構造体の配列って何要素ぐらいまでならメモリ確保できますか? だいたいでいいです Xpでメモリ1GBのマシンです。
408 :
デフォルトの名無しさん :2008/10/22(水) 19:25:06
メモリが多くあっても最大1.5Gくらいとおもう。
要素数的にはどのぐらいですか? HOGE hoge[20000];とか余裕ですか?
余裕だよ
2枚の画像を読み込み、1枚目の画像から2枚目の画像を引き算するような画像を出力する プログラムを自分なりに作ってみたんですが #include <stdio.h> #include <stdlib.h> #include<math.h> #define XL 900 #define YL 900 int main(int argc, char**argv) { FILE *fp1, *fp2, *fp3; int i; float opx, px1, px2; fp1 = open("argv[1]", "rb"); fp2 = open("argv[2]", "rb"); fp3 = open("argv[3]", "wb"); for(i=0; i<XL*YL; i++){ fread(&px1,sizeof(float),1,fp1); fread(&px2.sizeof(float),1,fp2); opx = px1-px2; write(&opx,sizeof(float),1,fp3); } fclose(fp1); fclose(fp2); fclose(fp3); return 0; } (fp3に引き算した画像を書き込む) コンパイルが通らず、エラーが出てしまいます; アドバイスをもらえるとうれしいです。
>>409 ためしに確保してみろよw
double 8byte
char 1bytex配列分
あとアライメントが入ると思うので数バイト加算
ここまでが構造体1つ分
正確なサイズが知りたければ
sizeof(HOGE)
構造体1個が何バイトになるか調べてみなよ
413 :
デフォルトの名無しさん :2008/10/22(水) 19:33:00
>>409 newとかvector使えよ。静的確保だと1.5Gの確保は難しい。
>>411 エラーの調査までさせる気きかよw
まずエラー読む癖付けろ
>>411 失礼ながら、コピペも出来ないようでは、
貴方にプログラミングは困難なのではないでしょうか。
僭越ですが他の道を検討してはどうかと愚考する次第です。
>413 ここはCスレだ。 帰れ。
>>413 やっぱりそうですよね。勉強します
ためしに hoge[200000];でやったら落ちました・・・
>>416 マルチだから少なくともコピペはできるみたいだよ
420 :
デフォルトの名無しさん :2008/10/22(水) 19:36:26
静的ではなく動的確保にしろって事
421 :
デフォルトの名無しさん :2008/10/22(水) 19:37:57
C言語だとmallocだが。 newやvectorのほうが実用的で初心者向き
C++のSTLですよね? 性的では確保できないサイズでも動的ならいけるんですか?
423 :
デフォルトの名無しさん :2008/10/22(水) 19:39:14
vectorのやり方 #include <vector> using namespace std; を先頭に入れて vector<HOGE> hoge(200000); で良い。
200000の領域を使いきるかわからないので、一度に確保してしまうのは無駄な気もします・・・ vectorなら必要におおじてふやせるんですか?
C++はスレ違い 他のスレに移動してから聞け
426 :
デフォルトの名無しさん :2008/10/22(水) 19:41:59
動的確保だと、状況によってOSが仮想記憶に移動させる。 (より広い領域が使える) 静的だと、メモリの固定した領域を使う。 解放はするが仮想記憶や他の場所へ移動はしない(はず)
427 :
デフォルトの名無しさん :2008/10/22(水) 19:45:16
vector<HOGE> hoge(100); でhoge.resize(2000); とか可能。 その都度、自動で増やさせることも可能。 vector<HOGE> hoge;として、hoge.push_back(x); xはHOGE型。
レスない・・・
お風呂はいってましたw vectorについてなんとなくわかりました。 続きはC++のサイトみてみます。
>>426 それは違う。
どういう確保の仕方でもOSの判断次第でページアウトされることはある。
昔、ワークステーション(今の感覚からしたらすごい貧弱なスペック)で仕事をして、元COBOLerの先輩の書いたところが異常に遅いなと思って、 ソースを見てたら、とにかくでかい静的配列を宣言して、全部データを読み込んでオンメモリで処理してたから、スワップしまくってたってことがあったな。 (仕様上はとくにデータのサイズの上限とかきまってなかったから、その書き方だと想定外のサイズのデータがきたらバグだろって感じだし)
スタックとヒープに分かれていて、スタックは高速にアクセス出来るようにC言語が直接アクセスしてるんでしょ。 ヒープはOSの命令に丸投げして確保するんでしょ。スタック領域は基本的にメモリに常駐しているのでは
>>431 そういうやばいプログラムって今でもどっかで動いてそうだよね
インフラらへんで
まあ詳しいことは知らんがな。
>>432 OSはヒープとかスタックとか考慮してないと思うよ。
アクセスの頻度とか、そういう基準でスワップするところを決めていて、結果として
スタックが追い出されにくいとかってのはあるかもしれないけど。
436 :
デフォルトの名無しさん :2008/10/22(水) 21:40:45
>>411 fp1 = open("argv[1]", "rb");
fp2 = open("argv[2]", "rb");
fp3 = open("argv[3]", "wb");
argvを囲ってる " は、いらねーだろ
437 :
デフォルトの名無しさん :2008/10/22(水) 21:47:57
でも、そういう名前のファイルを決めうちで開こうと してるのかも。
それより処理内容につっこんでやれよw
>>435 そうだね。 OSの命令使って固定した領域を確保してからC言語がそこを管理しているだけだろうから。
スタックでもOSからしたら、ヒープと変わりなくて移動する可能性あるね。
確保する量が1M以内とかだから、ほとんど移動対象にならないだけで
OSが一番偉い
スタックサイズをなるべく小さくした方が速度出ると思うので、変数以外はほとんど動的確保した方が良いかもしれないと思った。 でもauto変数と言われる類は、スタックへ入れた方がいいね。今度は動的の生成時間が掛かるから。
よく使う関数なら、stringを生成するよりも、char []を生成する方が速そうだ。(こっちはスタック上の生成だから) これは今日まで気づかなかった。
string、vectorは自動で消滅するから、auto変数の様に多用してしまっている。 仕組みを考えると速度的には不利になるな。
>>442 コンパイル時に必要な長さが決まってるか、c99でいくかするなら
それでもいいんじゃないかな
頻繁に呼び出す関数fncがあったとして fnc(){ string s; ・・・}より、fnc(){ char s[36768]; ・・・}のほうが良いらしいだろうってこと。 前者だと、毎回WinAPIを呼び出して、確保できる領域をサーチしに行くし、サイズが増えればまたサーチする事になる。
おにいちゃん ここCのすれだよぉ
>>445 処理量は後者の方が断然速いな。他の自動変数とまとめてスタックポインタ減算するだけだから1クロック。
fnc(){ string s; ・・・}をfnc(){ static string s; ・・・}にしたら速度的にはよくなると思いますが マルチスレッドで同時処理出来ないですね。 マルチスレッドでfnc(){ char s[32768]; ・・・}という関数は 同時処理できると思うのですが、この際に同時に100件処理したりすると スタック足らなくなりませんか? 同時にいくつ入ってくるかコンパイル時に確定出来ないと思うのですが? どうなるんでしょうか?
>>448 スタックって、スレッドごとに作られるんじゃないの?
そうなんですか。 そしたらスタック領域も動的確保だったんですね。 スレッド無しのときだけ、固定領域確保なんですか
ちがいます
スレッドは最低でもひとつはあるな。
454 :
デフォルトの名無しさん :2008/10/23(木) 00:24:54
linuxのstrncpyとVC8のstrncpyってどこが違うの?
大文字を小文字に、小文字を大文字に変換するプログラムなんですが、 問題ありますかね? #include <stdio.h> main() { char c; printf("inpput moji?\n"); scanf("%c", &c); if(c>= 65 && c<= 90 ) printf("%c --> %c\n", c, c+32); else if(c>= 97 && c<= 122) printf("%c -->%c\n", c, c-32 ); }
>問題ありますかね? はい。
把握しました
文字コードの値ではなく、'A'などのように文字定数を使うべき。 しかし、結局はtoupper/tolower使えということになるがな。
>>411 低水準ファイルI/O関数 open/read/write/close と、バッファリング付きファイルI/O関数 fopen/fread/fwrite/fclose とを
混同してしまっているのがコンパイルエラーの原因。 open関数をfopen関数に書き換えればOK。
460 :
デフォルトの名無しさん :2008/10/23(木) 02:58:45
「double double」 が許されるとしても それ以上の数字が欲しいときにはどうすればいいのですか。 例えば、何らかのテストで1無量大数バイトのファイルを単体で作りたいとして (HDDもそれを受け入れられるサイズがあると仮定) そんなとき、1無量大数分のサイズをディスクに確保しないとならんじゃないですか でもdouble doubleではそれだけの数字は入れられぬでは ないですか
>>460 速度気にしなくていいなら文字列でやるとか
そうね。ポインタが初心者を混乱させる原因はその宣言文の形式によるものだな。 int *a; とかだとaはまるでint型の何かであるような錯覚を与えてしまうからね。 仮に、ポインタ型みたいなものがあって、 pointer a(int); のように指定できれば混乱はだいぶ少なかったのではなかろうか。
>>462 int_p a;
とかでいいんじゃね?
ポインタを宣言するときに型を明示しないといけない理由を 明確に教えてる本とかサイトってあまりないよね。
>462 それは要素の一つではあるけど大したことじゃない(typedefで回避できるし) オブジェクトとそのアドレスと大きさという概念と、それを保存するということが理解できるかどうかが全て っていうかいつまでそれをほじくり返してるんだよ
ツェー言語ってのはパズルなんだ ワクを自分で作って、そのワクから溢れさせないようにしながら 盛ったり削ったりするパズルなんだ 自分で作ったワクなんだから溢れないだろ、とか言ってる奴ほど「できない」パズルなんだ
>>460 データは欠けるけど桁数的には何の問題もなくdoubleの範囲内
>>465 何でポインタだけ特別扱いするん?
配列とかも型を明示しないといけない理由を明確にしなくていいの?
1無量大数って1.0E+68か、確かにdoubleの範囲内だな
>>460 仮にそれだけのサイズのファイルを扱える処理系があるとするなら、
それはきっとそれだけの数を扱える仕組みを用意しているはずである。
そのような数が必要になってから考えればよい。
数値計算等で非常に大きな数が独自に必要なときは、
自分で実装するか、そのためのライブラリを探してみること。
void __memcpy_toio(unsigned long dst, const void *src, unsigned len) { __inline_memcpy((void *)dst, src, len); } (void *)dst
キャストとしても、キャストする理由が分かんね void __memcpy_toio(unsigned long dst, const void *src, unsigned len) { __inline_memcpy((void *)dst, src, len); } EXPORT_SYMBOL(__memcpy_toio); void __memcpy_fromio(void *dst, unsigned long src, unsigned len) { __inline_memcpy(dst, (const void *)src, len); } EXPORT_SYMBOL(__memcpy_fromio); void memset_io(volatile void __iomem *a, int b, size_t c) { /* * TODO: memset can mangle the IO patterns quite a bit. * perhaps it would be better to use a dumb one: */ memset((void *)a, b, c); } EXPORT_SYMBOL(memset_io);
キャストしなきゃポインタになりません
>>474 Cは整数(もちろん、適切な値を持った)をポインタ値に変換できることを保証している。
しかしそれはあくまでも「変換」できるという意味であって、整数を無条件でポインタ値とみなすということではない。
引数にポインタを必要とする場所に整数をそのまま書いたら、当然コンパイラは文句をつける。
WindowsはP64なんだよ・・・orz
fopenで書き込み時には上書き、読み込みもできるモードはありますか?
r+ のことか?
それです。どうも!
>>474 引数のI/O Portアドレスに、ヘキサ値や#define定数を直に書きたいという要望に合わせたんじゃね?
最初っからポインタにしとけ っちゅう考えはダメなのか
483 :
デフォルトの名無しさん :2008/10/23(木) 16:35:25
すみません。よく使う関数(ユーティリティ関数みたいなもの)を 便利にまとめたいのですが、Javaだとユーティリティクラスをつくってjarファイルにして持ち歩いていました。 Cの場合は、どういった手法が一般的なんでしょうか?
hとlib(a)作ってinclude と libディレクトリに入れておく libがスタティックリンクじゃないときは、DLL(so)も
ライブラリとか? .lib とか .dll とか .a とか .so とか ,h も要るけど
DLL
487 :
デフォルトの名無しさん :2008/10/23(木) 17:52:19
プログラム初心者です。 授業で出された課題がセグメンテイション違反になって、かれこれ3時間ほど考えても解けないので是非教えていただきたいです。 <課題>2つの任意の長さの文字列をポインタ変数pxとpyを使って入力し、pxとpyの文字列を結合した文字列を他のポインタ変数に記憶し、その結果を出力するプログラムを作成せよ。 。ただし、ヘッダファイルstring.hで定義されている関数およびsprintfを使用してはならない。 <私の書いたプログラム> #include<stdio.h> main(){ char *px="guruguru",*py="kapikapi",*pz,*ret;ret=pz; while(*px != '\0'){ *pz = *px;pz++;px++; } while(*pz!='\0'){ pz++; } while(*py!='\0'){ *pz=*py; pz++; py++; } pz=ret; printf("%s\n",pz); } 間違えだらけかもしれませんが、いろいろと指摘してください。お願いします。
>>487 ポインタpzはどこを指している?
2個めのwhileは不要
pzに最後に'\0'を付ける必要がある
問題がおかしい気がする
>ポインタ変数pxとpyを使って入力し 使って入力、が意味不明 どこから入力するのかも不明 >pxとpyの文字列を結合した文字列を どう結合するのか不明 >他のポインタ変数に記憶し ポインタに文字列そのものを記憶させることは出来ない 仮にポインタの指す先と解釈してもそれは領域を別途用意しなきゃいけないが malloc使えってレベルには見えない、配列なら配列と言えば済む >その結果を出力するプログラムを作成せよ。 結果の意味が不明、出力する先も不明 普通に考えれば結合した文字列を標準出力に出力せよ、だが
>>487 マジレスすると、「これが問題文そのままなら、こんな課題を出す人の気が知れない。」です。
> 2つの任意の長さの文字列をポインタ変数pxとpyを使って入力し、
> pxとpyの文字列を結合した文字列を他のポインタ変数に記憶し、
入力元が書かれていないぞ〜。一体どこから入力するんだ?
> ただし、ヘッダファイルstring.hで定義されている関数およびsprintfを使用してはならない。
もうアホかと・・・
>>492 宿題スレに投げられる宿題はおおよそそんな感じよ。
てーちゃーの質が悪すぎるのはガチ
あまりにも問題がへぼすぎて実は問題をざっくり作った教師が
スレ住人に精査させてるんじゃないかという場面さえあった。
>>492 こんなんにマジレスするのも面倒だが、
入力元の指定がない→入力できればなんでもよい
ただし、この段階であれば大抵は標準入力を利用するだろうと想像できるが。
string.h および sprintf の禁止→小学校の算数のテストで電卓使っちゃダメというのと同じこと
けちつけるならあなたが納得できる課題文の例をあげてみなよ。
const char *関数名() ここでの*って、どんな意味ですか?
const char* 関数名() これでどうだ
戻り値の型がポインタだということ。 「const char *」で1つの塊だと認識してもいいくらい。
ありがとうございます>< const char *getSeatName(const seat_t *sp) { return sp->name; } nameはchar型の配列なんですが、こんなんで合ってますかね?
499 :
デフォルトの名無しさん :2008/10/23(木) 21:40:29
: error LNK2019: 未解決の外部シンボル _prntf が関数 _main で参照されました。 : fatal error LNK1120: 外部参照 1 が未解決です。 VS2008でC言語のプログラムを作ったのですが、コンパイルしようとしたら↑のような エラーが出てきてしまいました。どうすればよいのでしょうか?
stdio
prntfという関数が無いだけだ。 printfじゃねぇの?
>>499 おまえ、C#のスレでおしえてやったじゃん。
なんでわからんの?
int型でもなんでも、宣言直後の状態かどうか(ゴミの値が入ってるかどうか)を判別したいときは どうすればいいですか? 配列用にをmallocで領域を確保して、その配列の最後の要素の直後の位置を返したいのですが、 tmp = (int *)malloc(sizeof(int) * 10); /*配列にいくつか値を代入する*/ while(/*配列に要素が代入されているなら*/){ tmp++; } こんな感じのを書きたいのですが、whileの条件文が思い当たりません。よろしくお願いします。
値を代入するのなら、最後に代入した位置を保持すれば良いじゃない
>>504 いまいちよくわからんけど、その処理ではありえない値で初期化しておくか、別にフラグの変数を用意するか。
>>504 値を代入したその「いくつか」ってのを覚えておけばいいと思う
>>494 > 想像できるが。
出題文に書かかない他の意図がある出題者、文面に書かれていることだけが情報となる解答者。
この両者で認識が一致するとは限らないから、こういう読み手の想像に任せることは良くないんだぞ。
普通に問題文に仕様として「標準入力を使用して〜」の文言を加えればいいだけなのに。
このような婉曲で言葉少ない「悟りと想像」に委ねたコミュニケーション方法を使って教育をすることは、
一般大学や正統な職業専門教育の場では非常に少ないと思う。 まさか母体は密教とか宗教系?
509 :
487 :2008/10/23(木) 22:39:45
>>488 すみません。以後気を付けます。。
>>489 >ポインタpzはどこを指している?
mallocを使えってことですか?
>pzに最後に'\0'を付ける必要がある
どう付けたらいいんでしょうか?
>>490 おかしいんですかね・・・(汗
>>492 >マジレスすると、「これが問題文そのままなら、こんな課題を出す人の気が知れない。」です。
一字一句間違いなく入力したはずです。。無理な問題なんですかね??
510 :
492 :2008/10/23(木) 23:05:42
>>509 ああ、スマン。自分はその出題をした先生の流儀を知らないので。教わったことがない先生になら多分、
「文字列の入力元が指定されていないですが、例えば標準入力からであるとか、自分で決めてOKですね?」
と尋ねると思う。こういうのは国家試験などの出題ではあり得ない出題文だから。
もし問題文に対する質問を受け付けないという条件があれば、、、標準入力を入力元に決めるかな。
511 :
デフォルトの名無しさん :2008/10/23(木) 23:10:05
char *src; src++と*src++の違いを教えて下さい
元の文言を可能な限り残した上で問題としての体を整えると、こうなる。 2つの任意の長さの文字列を、 標準入力からポインタ変数pxとpyの指すメモリ領域上に読み込み、 pxの指す文字列の後にpyの指す文字列を連結した文字列を、 他のポインタ変数の指すメモリ上に書き込んで、 その文字列を標準出力に書き出すプログラムを作成せよ。 しかしこれは明らかに、わざわざ配列を宣言してから対になるポインタに配列を指させるか、 あるいはmallocを使って動的に領域を確保するかの二択になる。 前者は処理そのものが意味不明だし、後者は難易度が初心者向けではない。 おそらく、出題者の意図したことはこうではなかろうか。 十分に大きい文字配列x,y,xを用意する。 2つの任意の長さの文字列XとYを標準入力からxとyに読み込み、 x,y,zの各配列上を指すポインタ変数px,py,pzを使用して、 Xの後にYを連結した文字列をz上に書き込み、 その文字列を標準出力に書き出すプログラムを作成せよ。
>>511 *無しのほうは、式の値はsrcで、評価されたあとにsrcの中がインクリメントされる。
*有りのほうは、式の値はsrcが指してるcharの値で、あとは同じ。
おまえら課題を出す前の講義の存在を考慮してやれよw
>>512 「ポインタ変数pxとpyを使って入力し」て無くない?
俺は初期値が配列の先頭を指すポインタ変数使って、
getchar()を使って1文字ずつ読み、
その後は512な感じの問題だと思った。
ポインタの使い方のお勉強と思えば、特に不自然でもないと思う。
516 :
492 :2008/10/23(木) 23:24:27
あ、、、俺だったらやっぱり、コマンドライン引数を入力にして使うかな。 void main( int argc, char *argv[] ) { char *tx, *py, *pz; if ( argc <= 2 ) return; // ポインタ変数px/pyへの入力 px = argv[1]; py = argv[2]; : : (以下省略) : }
517 :
デフォルトの名無しさん :2008/10/23(木) 23:55:48
stcatは後ろ側に文字列連結しますが、前側につくやつはないですか?
string s="test"; s="mae"+s;
519 :
492 :2008/10/24(金) 00:04:34
>>487 <回答例>
二つの文字列をコマンドライン引数から入力し、その文字列を連結した結果を表示(標準出力へ出力)する。
=======================================================================================
#include <stdio.h>
#include <stdlib.h>
void main( int argc, char *argv[] )
{
char *px, *py, *pz;
char *px_end, *py_end;
// コマンドライン引数は3個必須。
if ( argc <= 2 )
return;
// ポインタ変数px/pyへの入力
// ※出題での条件をクリアするため
px = px_end = argv[1];
py = py_end = argv[2];
// 文字列の終端位置を確定するための処理 px_end = px; py_end = py; while ( *(px_end++) ); while ( *(py_end++) ); // ポインタ変数 pz に連結文字列を格納できるサイズのバッファを割り当てる if ( ( pz = malloc( (px - argv[1]) + (py - argv[2]) + 1 ) == NULL ) return; // str〜 関数が使えないので、ちまちまと代入していきますwww。 for ( px = argv[1]; *px != '\0'; px++, pz++ ) *pz = *px; for ( py = argv[2]; *py != '\0'; py++, pz++ ) *pz = *py; *pz = '\0' // 最後に結果を標準出力に表示させます。 printf( "入力文字列_1:[%s]\n入力文字列_2:[%s]\n出力文字列:[%s]\n", argv[1], argv[2], pz ); } =======================================================================================
521 :
487 :2008/10/24(金) 00:34:35
>>510 >標準入力を入力元に決めるかな。
私もそれでやってみようかと思います。その場合は*pxと*pyにもバッファを割り当ててあげなきゃいけないんですよね?
>>519 >void main( int argc, char *argv[] )
今までmain関数については
void main(void)という使い方しかやってこなかったのですが、mainの引数はどこからもってきたのですか?()の中で何が行われているのかよくわからないです。。
>>521 > その場合は*pxと*pyにもバッファを割り当ててあげなきゃいけないんですよね?
そうなんですけど、文字列の長さが確定する前にmallocでバッファを割り当てることは困りますね。
一文字ずつ取得する関数のfgetc/getcとリスト構造のアルゴリズムでやれないことはないけども・・・
>>521 というわけで、出題のレギュレーションに準拠し、標準入力を使って文字列を入力する方法は、
1. fgetcで標準入力から1文字取り込む(標準入力のバッファには入力された文字列がプールされている)
2. mallocで1文字のリスト構造を割り当てて取り込んだ文字を格納する(構造体を使うことはセーフ)
3. リスト構造のリンクを張る
4. 上記の1.-3.をfgetcがEOFを返すまで繰り返す
というのが一つのスタンダードでしょうか。他にも考えられるかも知れませんが・・・。
このような考え方って、会計や法務での具体的な処理方法や規程を作る作業のようですね。
>2. mallocで1文字のリスト〜〜 そういう方法を取るなら、256バイトのブロックのリストとかにすることが多い。 1ブロックを何バイトにするかは主にどのぐらいの文字数を入力するかでテケトーに決める。 他にはreallocを使う方法などある。 >4. 上記の1.-3.をfgetcがEOFを返すまで繰り返す ぼちぼちスタンダードかも知れない。 EOFで読み込みを停止するなら、文字列の入力終了が 例えばCtrl+D(Unix系)とかになるのが分かってるなら問題なさげ。
>>524 おおっ!
reallocを使ってバッファサイズを1文字分ずつ拡張しながら入れ替えさせるのも合法wですね!
それを使って「後入れ先出し法」と等価な処理をC言語で関数化すれば、クラスっぽい使い方
もできますね。 2個必要になりますが・・・
526 :
525 :2008/10/24(金) 03:24:46
あ、「先入れ先出し」(FIFO)なのに間違って「後入れ先出し」(LIFO)て書いてた。スマソ
>>516 なんでポインタほやほやなのがみえみえなレベルの課題にダブルポインタ持ち出すわけ?
国家試験だとそういうのが流行り?
標準入力から受け取るのがレギュレーションになってた(ポルナレフAAry
#define MAX_LEN 512 char x[MAX_LEN+1], *px = x; fgets(px, MAX_LEN, stdin); じゃだめなん?
どんだけ国家試験好きなんだよ…
531 :
483 :2008/10/24(金) 05:49:35
>>484 詳しいご回答ありがとうございます。dll(so)は、実行時にそれの中の関数を利用するみたいですね。
逆にlib(a)は、コンパイル時に一緒くたにされてexeファイルなりの実行ファイルができるみたいですね。
ヒントを下さったおかげでだいぶCのライブラリについて調べる事ができました。libディレクトリに関しては
もうちょっと色々調べて見ます。とても、参考になりました。ありがとうございました。
>>485-486 語句をおしえていただいたので、それを参考に色々調べる事ができました。
自分なりにググって色々しらべてだいぶ理解する事ができました。Windowsの
フリーソフトにときどきついてくるdllというのがどういうものかとか、よくわかりました。
でも、libっていうのは、あまり見かけませんね。これは実行ファイルに含まれてしまっているから
当たり前ですが・・
みなさん、回答ありがとうございました。お礼が遅くなり済みませんでした。
すみません、 &(a->a[i]) は優先順序的に &a->a[i] で大丈夫でしょうか? コンパイルはうまく行ったんですが自信が無くて><
ソースに書いた関数名とか変数名ってコンパイルしても残ってるの?
>>533 残るも残らないも、環境とコンパイルオプションによって異なります。
まぁ、全く残さないケースはないと思いますが、それと同様に全て残ると言うものでもありません。
535 :
デフォルトの名無しさん :2008/10/24(金) 11:29:50
strchrの第二引数は何故int型なのですか?
ansi以前のcでは引き数にcharが使えなかったので、その名残り。
double型の最大値には、float.hのDBL_MAXを使うのがよいのでしょうか? それともsizeof(double)=8でしたので、0x7FFFFFFFを使うのがよいのでしょうか。 [ソース] printf("sizeof(double): %u bytes\n", sizeof(double)); printf("0x7fffffff: %g\n", (double)0x7fffffff); printf("DBL_MAX: %g\n", DBL_MAX); [結果] sizeof(double): 8 bytes 0x7fffffff: 2.14748e+09 DBL_MAX: 1.79769e+308 [環境] $ uname -mrs Linux 2.6.25.16-0.1-default i686 $ gcc --version gcc (SUSE Linux) 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] よろしくお願いします。
>0x7FFFFFFF 4byte
>>537 あんた馬鹿? 整数型じゃないのにサイズがどうこうって、IEEE754くらい眺めなさいよ。
541 :
デフォルトの名無しさん :2008/10/24(金) 13:03:51
これからVC++無償版で勉強始めたいと思ってます。 このスレの質問ざっと見てさっぱりわややなんでチト不安に思ってます。 VC++って2008とか2005とかドットネットとかありますが、 現在入手できる2008 Express Editionで問題ないでしょうか? インスコする時に.net Framework3.5が入れられるんで .net Framework3.5の入ってない環境では動かないプログラムしか 作れないんでしょうか? もしそうなら汎用性の高いバージョンはどれになりますか?
543 :
541 :2008/10/24(金) 13:20:29
ありがとうございます。安心しました。 日経BPの本も注文したんで、基本編くらいは出来るようにがんばります
>>539 >>540 4バイトで書いてました(゜o゜)
挙げられた規格で指数部のバイアスに関して触れられていたので、
それを考慮して今度はprintf("%g", 0x7fefffffffffffff)とすることで1.79769e+308を得ることができました。
ありがとうございます。
ところで、この行で「0x7fefffffffffffffはlong long intであってdoubleではない」という旨の警告が
コンパイラから出ているのですが、これを直接doubleであるとコンパイラに分からせるためには
どう表現すればよいのでしょうか?
それと、
> あんた馬鹿? 整数型じゃないのにサイズがどうこうって、IEEE754くらい眺めなさいよ。
これに関してなのですが、
doubleだとsizeofでサイズを取得すること自体が間違っているということでしょうか?
長文失礼しました。よろしくお願いします。
charを撤廃してintに一本化したいのですが なぜいかんのですか。 前の会社の先輩は 「文字が入らなくなるだろ!」 とか変なこといってましたが 本当ですか。
>>544 doubleとlong long intの共用体を作れば
#define -2 'き' #define -1 'く' #define 0 'け' #define 1 'こ' #define 2 'さ'
キャスト
>>545 char str[] = "abc";
これをintでどう扱う?
ここは入門篇なので以後ポインタの質問はご遠慮ください。
いや、つまんないから
ポインタは初級者こそ習得すべきものだろ いらんとこまでわざわざポインタにする ご時世だから
>>550 同意、あと構造体もやめていただきたい
今の俺にはまだ早すぎる
strcmpって大文字小文字区別ですよね?区別しないやつはありますか?
もし皆さんが文字列の中から一文字を置き換える関数を作るとしたら どのような関数名にしますか?
replace_char
>>555 replaceChar()
>>554 標準ではないが、準標準にはstricmp()がある。
>>544 整数値と違って、0x7fe....が常に最大値になる保障がないからDBL_MAXを使うべきってことだね。
>>558 _stricmp()というのもあったんですが、違いはなんですか
マイクロソフトの趣味で、(自社製でない)非標準関数には尽く_がついているようです。
stricmp、wcsicmp Visual C++ 2005 では、これらの POSIX 関数は使用しないでください。 代わりに ISO C++ 準拠の _stricmp、_wcsicmp、_mbsicmp、_stricmp_l、_wcsicmp_l、_mbsicmp_l を使用してください。
わかりました!
>>555 int supra_reset_char_Dynamite2(
char *pOut, // 変更先文字列
int iIndex, // 変更位置
int iOriginCharByteSize, // 変更先の文字のバイト数
char cResetChar, // 変更後の文字(1byte用)
short sResetChar, // 変更後の文字(2byte用)
int iResetChar, // 変更後の文字(4byte用)
int iResetCharByteSize); // 変更後の文字のバイト数(1,2,4のみ)
こんなかな。
_tcsicmp を使うべきなんだろうけど、みんなtchar.h対応してる?
>>563 xResetCharはunionにしないの?
>>564 もはやMBCSなんて気にしてない。W関数一筋。
string.h一筋
568 :
デフォルトの名無しさん :2008/10/24(金) 18:34:20
質問です。 エラーで発生するstrayが具体的に指してることを教えてください。 発生原因や対策はわかっているんですが、strayの意味を問われて困っています。 ググっても対策しか見付からなかったのでよろしくお願いします。
Cにstrayなんて用語ありません
すいません 初心者なもので違いがわからず書き込みました。 適切なとこ探してきます
教えてください int i; printf("%p\n",&i); "%p\n",&i で変数iのアドレスが求められているのはわかりますが "%p\n",i では一体何を求めているのですか?
>>572 求めているんじゃない
その形式で表示しているだけだ
だからiの値がアドレス値であると見なしてその形式で表示する
>>572 %p は、渡した値をアドレスとして表示する
実際に何を渡そうが、それをアドレス値として解釈して表示する
&i を渡せば、正しく &i のアドレスを表示するが、
i を渡せば、i の値を無理矢理アドレスとして解釈したわけのわからないものが表示されるかもしれない
>>560 趣味じゃないだろ。規格で下線で始まる名前が処理系予約だからそうしているだけ。
つまり、そうしなくてもいいわけですね。
>>564 ジェネリックテキストで、マルチとワイドの両方に対応なんて、ほとんどのところでできてないだろうし、
どっちかに絞ったほうが賢明な気がするな。
今だったらWか。
>>578 ワイドが便利だな。
必要に応じてコード変換すればいい。
isalpha()を自作するなら、皆さんはどのように記述しますか?
int isalpha(int c) { static const char int table[] = { ............ }; return table[c & 255]; }
582 :
581 :2008/10/24(金) 21:17:37
const char int ってなんだよ俺orz 適当に読み替えてくれ
int isalpha(int c) { return !iscntrl(c) && !isdigit(c) && !ispunct(c) && ! isspace(c); }
//保守性の高いコード int isalpha(int c) { if( c == 'a' ) return -1; if( c == 'b' ) return -1; ・・・ if( c == '0' ) return 0; if( c == '1' ) return 0; ・・・ return 0; }
585 :
デフォルトの名無しさん :2008/10/24(金) 21:26:57
#include <stdio.h> int afo(char a) { int ret = 0; if( (0x41<=a) && (a<=0x5A) ) ret = 1; else if ( (0x61<=a) && (a<=0x7A) ) ret = 1; return(ret); } int main(void) { printf("%d\n", afo('A')); return(0); }
>>585 ,-、 nn
. r-、 _00 /::::'┴'r'
. |::::'´::::r┘ !「`L00、|.l└ク_;厂 /
. |::::「|:::| l| |Ln:::r┘|.l _lニユ、 ./
.  ̄└r''"´]_ l| | r゙=゙┐ |└ァ::/ / /
、ヽ、 ,ゞ´_::::| l| |「二:::7 .|.l └′/ / /
. \\`´ |:::|. l| l 〈::/ 、 !
,. -───-- 、_
rー-、,.'" `ヽ、.
_」::::::i _ゝへ__rへ__ ノ__ `l
く::::::::::`i / ゝ-'‐' ̄ ̄`ヽ、_ト-、__rイ、
\::::::::ゝイ,.イノヽ! レ ヽ,_`ヽ7ヽ___>
r'´ ィ"レ´ ⌒ ,___, ⌒ `! i ハ
ヽ/ ! /// ヽ_ ノ /// i ハ ',
.ノ /l ハノ i ヽ.
〈,.ヘ ヽ、 〈 i ハ i 〉
ノ レ^ゝi>.、.,_____,,...ィ´//レ'ヽハヘノ
/⌒`γ´ハ_,,.イ´レ`ヽ、 /⌒ヽ、
〈r'^ヽi /^L_!ムイ_」^ヽ. .〉´ / i' \
`7 _ノ'§ !、_ !,イ__'⌒ヽ、ノ i
i、_ノ !、,§__、ハ、_ノ、/、__ ⌒ヽノ
r/ `ー--─ヘ´``ヽ、_イ
/ / ', ヽ、 >、
rく__ ハ ゝイン
`'、__ニ、_r_、_イ__r__ェ_'ン´.......
::::::::::i__,7:::::::::i,__,7::::::::::::::::::
::::└'゙::::::::::::i,_,/:::::::::::::::
コピペ君って馬鹿だな、まで読んだ。
588 :
584 :2008/10/24(金) 21:34:59
やはりreturnは最後の一箇所にすべきだったか int isalpha( int c ) { int ret; if( c == 'a' ) ret = -1; if( c == 'b' ) ret = -1; ・・・ if( c == '0' ) ret = 0; if( c == '1' ) ret = 0; ・・・ return ret; }
せめてswitchにしようや
591 :
584 :2008/10/24(金) 21:42:28
>>589 引き継ぐ奴がswitch文を知らなかった場合保守性が悪くなる
それに引き換えif文とreturn命令さえ知っていればコピペ改変でなんとかなるのは保守性がいい
・・・なんてこと本気でいう奴はいないと思いたいが・・・
char *buff[3] //文字列へのポインタの3つ この場所に ほかの関数で文字列を代入してもどってきたいんですが、どう書けばいいんですか? func(char *buff[]){ strpcy(buff[0],"hogehoge"); } func(buff); こうですか?
ポインタはアドレスを入れる箱です 実体は別に必要です
char *buff[3] これでポインタ3つ宣言されて、この時点ではどこを指してるか不定。 ってことですよね?
int func(char *buff[]){ buff[0] = "hogehoge"; buff[1] = "hogehoge2"; buff[1] = "hogehoge3"; return 0; } int main(){ char *buff[3]; //文字列へのポインタの3つ func(buff); } あ!もしかしてこうですか?
597 :
デフォルトの名無しさん :2008/10/24(金) 23:02:32
配列xを引き数として受け取る時、 *xとx[]は同じですか?
>596 あってることはあってる その文字列は定数であって原則書き換えられないことを理解してれば >597 同じ 正確に言えばそもそも配列を引数にとることはできない 関数の引数リストに配列を書いたらそれは実際にはポインタになる
>>598 つまり値わたしはできないってことですか?
>>599 配列先頭へのポインタの値渡しになってしまうので、配列そのものは渡せない。
>>600 なるほど。コピーが発生しないためですかね?
>>601 「ため」を「原因」と「目的」のどっちで使ってるか知らないけど、違う
Cでは値として渡すことのできる「配列全体」というものが存在しないから
どうしても配列全体を値渡ししたい場合は構造体につっこむ
>>599 厳密に言うと、C言語のポインタ渡しは「値渡し」なんです。わかります?
void func( char* str )
{
;
}
void main( void )
{
char* str = "ABC";
func( str );
}
上のような場合、関数mainから関数funcへポインタ変数ptrの値をそのまま渡すので、値渡しなんです。
void func( char str[] ) { ; } void main( void ) { char str[] = "ABC"; func( str ); } こう書き換えると、「参照渡し」になります。わかります?
>>604 嘘教えるなよ。C に参照渡しは存在しない
>>605 関数funcへは、関数mainで宣言した変数の型どおりの型と値で渡していませんよね。
初期のC言語の構造体もそうですが、変数の型と値の代わりに変数のアドレス(他所で参照できる
ようにするためのポインタ値)を渡すので、参照渡しになるんです。
値渡し= int型変数をint型の値のまま、char型の値をchar型の値のまま渡す。。。など。
しかし、過去の多くの専門書の説明は間違いだらけだったんですよ〜。
初期のアスキーラーニング、三田氏の「入門C言語、実践C言語、応用C言語」シリーズとか・・・。
配列とポインタとアドレスの説明で色々と・・・
>>606 配列の情報の渡し方。これが唯一、高級言語風の参照渡し。
まぁ、ポインタ型やアドレスを扱えるC言語では例外的な扱いだろうが。
二次元配列の渡し方とか扱い方がさっぱり分からない 詳しいサイトとか無いだろうか
>>609 2次元配列だろうが1次元配列だろがさほどかわらん。
トータルのバイト数が同じならどっちも単なるメモリの塊で
先頭アドレスと何次元配列で配列の最大数がわかればいい。
>>608 配列って単にoffset, stride, indexから目的のアドレスに変換されるだけで、参照という概念はないよね。
値渡し/参照渡しでの概念としてはまぁ近いものとしても考えられるけど、
値渡しってのがそもそもデータ型をコピーしてパラメータに渡すことなので、
基本データ型であるint,char,long,double,float,pointer以外は渡せない。
なのでpointerでも参照渡しというわけではなく値渡しなんだな。
文字列というのが単にchar型の配列にルールを決めて文字列として見立てているだけだから、
その先頭アドレスへのポインタの値渡し、になるのでは。
>>609 ▼関数main内の2次元配列を関数funcに参照渡しして、関数func内で同じように使いたい場合
void func( int array[4][8] ) // ←厳格な添え字付き引数リスト。(理解のために、まずこれを押さえておいてね☆!)
{ // この場合、int array[][8]と4を省略して書けるので、配列の仕組みを理解したら省略OK。
array[0][0] = 0; // ただし添え字を省略できるからこう書くのを、これが本来の書き方だと思い込んだまま
array[0][1] = 1; // 教える先輩も多くいるので、嫌われトラブル防止のため省略して書けるよう覚えましょうw。
array[0][2] = 2;
:
:
}
void main( void )
{
int array[4][8]; // 4×8 の2次元配列
int i, j;
func( array ); // 関数funcへ2次元配列をそのまま参照渡し
for ( i = 0; i < 4; i++ ) {
for ( j = 0; j < 8; j++ ) {
printf( "%d\n", array[i][j] );
}
}
}
>>609 ゲームとかでグラフィックデータをいじると簡単なんだけどな。
512x512 の画像データを[512][512]でみようが[262144]でみようが問題ないし。
614 :
613 :2008/10/25(土) 04:52:57
>ゲームとかでグラフィックデータをいじると簡単なんだけどな。 ゲームとかでグラフィックデータをいじったことあれば簡単なんだけどな。
>>612 まぁ int array[][8]
も仮引数の書式としては正しいんだが
正しい間違ってるについて言うんだったら
実際に渡されてくる形式は int (*array)[8] であることも言及しといた方が良いな
知らずにsizeofしかねない
616 :
612 :2008/10/25(土) 05:42:48
>>615 正統な「C言語エッセンシャル」と呼べるハイクラス教本を一冊書けるなw
入門篇スレとしては慎重になるけど、「嘘も方便」とばかりに誤魔化した理屈で一旦は
解った気にさせ、次のステップでは過去の教えた理屈を覆す、昔の理科教育のような
解説本や説明もどうかと思うし。
本当のことを言うと、C言語の関数間で渡される引数は、値渡し&参照渡しの概念が 及ぶ前に、そのメカニズムが出来上がったので、実は後付け理論の側面がある。 関数に値を渡すメカニズムは、CPUの命令コード push, pop に依存していたのです。 C言語上で引数を1個渡して関数をコールする場合、一律にCPUがpush命令で値を1回だけ pushしてから関数のアドレスをcallするというアセンブリ言語に変換されるメカニズムでした。 つまり、16bit 2バイトのアーキテクチャであれば、単に2バイトのデータをpushして関数をcallし、 callされた関数側では、2バイトのデータをpopして取り出すという単純なメカニズムだったのです。 このメカニズムでは 2バイトを超えるデータはpush/popできないので、引数で渡せない という仕様でした。また、1バイトのchar型の値もpush/popに依存する2バイトデータとして 渡していました。昔の処理系ではfloat/doubleの値を渡せなかったり、標準ライブラリの isalpha関数やfgetc/fputc関数のの引数や返値がint型なのはその名残りです。 ガッテン!!☆ していただけましたでしょうか?
>>617 >つまり、16bit 2バイトのアーキテクチャであれば、単に2バイトのデータをpushして関数をcallし、
>callされた関数側では、2バイトのデータをpopして取り出すという単純なメカニズムだったのです。
x86とMS-DOSのシステムコールなんかから言わせてもらうと
これは間違いじゃねーのか?
callで呼び出す際にスタック使ったらおかしくなるんじゃねーの?
だってcall命令発行=スタックに戻り先アドレス格納だったぜ。
つまりcallで呼び出された側はpopx2回発行してデータを取り出すとか
しないとだめだし。
呼び出し規約次第 一般にはスタックは使われてるはずだけどな。
>>618 呼び出された側はPOPでデータ取り出しはしないよ。
スタックポインターからの相対でデータを取り出してる。
スタックポインターの先頭はCALLしたときのPUSHされる戻り先アドレス。
POPは呼び出した側がCALL後でスタックポインターを元に戻すために行う。
と、思う。
621 :
デフォルトの名無しさん :2008/10/25(土) 08:50:54
さよう。今でこそ実引数と仮引数の数は一致しなければならないが (... は別ね) その昔は引数を逆順にスタックに積んでおくとこで 実引数が多い分は無視、足りない分はゴミが仮引数に対応させられる 処理系があった。この場合、呼び出され側がpopしたら大変なことに。 (というか、呼び出された側がpopする処理系はC以外でも稀だろう。)
「今でこそ」ってあんた。一致していることを保証するのはプロトタイプがあるときだけじゃないか。 プロトタイプがなければ、今でも不一致のまま呼べてしまうのだけどね。 ついでに言えばpascalのように引き数のチェックが厳密な言語では、 呼び出された側でpopする方が効率がいいのでそういう戦略は決して稀ではないよ。 # そうでなければ、スタック巻き戻しつきのret命令なんかがCPUに用意されるはずもないし。
>617はさも正しい歴史を書いているように見せて実は只の妄想なので要注意。 大体、doubleが渡せないってどんな寝言なんだか。 MS-DOS時代のCに限定しても、intより大きいlongもちゃんと渡せたわけだが。
>>617 ALGOLの段階で値渡し、参照渡しがあったのに、Cの作者がそれを知らないわけないだろ。
参照渡しはポリシーで作らなかったんだよ。
>>618 MS-DOSが誕生する以前の1970年代、UNIX誕生当時のCPU仕様では
CALL ADDR
↓
PUSH PC
JUMP ADDR
というように、アセンブラのCALL命令は、機械語レベルでは複合命令に分解して変換
してた時代を経ている。 ※その後CPUはマイクロコードが高度ソフトウェア化してくる
C言語で引数1個の関数の呼び出しは、コンパイルで
1. 引数値をレジスタにロードして PUSH
2. 戻り番地=PCレジスタの値を PUSH
3. 関数番地ADDRへ JUMP
というシーケンスで行われるアセンブリ言語に落とされた。基本は今も変わっていない。
呼び出された関数側では、1回のPOP命令で1個の引数値を取り出してた。
元の関数へ戻るときは、もう1回POPして戻り番地をPCレジスタにロード(RET命令相当)
して実現していた。
>>623 C言語の歴史から見れば、MS-DOSは比較的新しい。C言語コンパイラが移植合戦で
百花絢爛の1980年代末以降の人は、double値がポインタで渡された理不尽な処理系
が多かった時代をあまり知らない。
>>620 それ、MS-ASMのバージョンアップで途中からアセンブラ命令レベルで
スタックフレームに対応したから。MS-DOS V3の頃からでしょ。
>>627 別にアセンブラは関係なくスタックフレームは作れるでしょ。
昔のDOSのコンパイラは、直接objファイルとか吐けないで、アセンブラのコードを吐いていて、MASMがない環境では開発できなかったとか? それはなさそうな気が。
>>629 直接objを作れなかった時代もあった。
コンパイル済みのリロケータブルモジュールもインテルHEX形式だったりマイクロソフト形式とか
独自形式だとかあって、専用のリンカが必要なものがあったり。
何しろ20年以上前の話だから・・・
C言語もここまで遡ると、東京五輪とか新幹線開業と同時期に生まれた人じゃないと憶えて
いる人は少ないな。
でもアセンブラのコードを吐いてて、MASMがスタックフレームに対応してなかったから、スタックフレーム作れなかったってのはないだろ。
633 :
デフォルトの名無しさん :2008/10/25(土) 11:09:43
MASM はもともとスタックフレームに「対応」する立場にないからな
>>631 インテルヘキサはリロケータブルオブジェクト形式で使うものじゃあないだろうよ。
>>608 それは配列のアドレスを渡しているの。参照は渡してない。
C++の参照しか頭にない奴は消えろよ
意外とおっさん多くてワロタ
いつのまにか、 「“C言語”と表記する奴にロクなのがいない」法則、てのが 真実味を帯びるスレになっている。
おっさん風のゆとりもいるようだが
ゆとり風のおっさんかもしれんぞ
らんぐあげしー
643 :
デフォルトの名無しさん :2008/10/25(土) 13:26:12
まあ,JISはろくでもない。
質問お願いします /*10進数→2進数*/ #include <stdio.h> int main(void) { unsigned int n, i=sizeof(unsigned int)*1<<8-1; scanf("%d", &n); while((i&n)==0) i>>=1; while(i) { putchar(n & i ? '1' : '0'); i >>= 1; } return 0; } これのiを宣言するところをi=1<<8-1にしても2進数への変換はできたのですが sizeof演算子を使うことによってどういうメリットがあるんでしょうか?
軽自動車だからといって軽油を入れるな
>>645 >質問お願いします
質問をお願いすると言うことは、こちらが質問をすればいいのでしょうか。
>>645 変換する10進数の上限は決まっているのでしょうか?
i = 1<<(sizeof(int)*CHAR_BIT-1); なんだろ?
エスケープ文字でページの先頭に飛ぶ記号ってありますか?
現在のページの先頭に戻るという意味です
ありません
そうですかどうも
>>651 君が言っているのは制御文字であってエスケープシーケンスではない
エスケープシーケンスというのは通常では記述できない文字
(制御文字を含むが、それだけではない)を指定するための表記のこと
で、「ページの先頭に戻る」制御文字は存在しない
ただ、もしかするとフォームフィード(0x0d, '\f')が君の望むことをやってくれるかもしれない
今トランプゲームのプログラムを作っています。 トランプの表示をハートの1ならH1、ダイヤの13ならD13などというように表示しています。 手札のトランプを配列に入れる場合どのように入れたらいいでしょうか? アドバイスお願いします。
プレイヤーの人数や手札の枚数、ゲームのシステムによるとしか言えない
>>656 それぞれのカードに番号をふって、整数で管理するとか。
てか、現状はそれ以外の方法でやってるのだろうか。
どのようにも何も頭から1個ずつつっこんで何か不具合があるのか
>>656 このように
配列名[要素番号] = カード;
>>660 トランプのデータ領域
ユーザに配るデータ領域
に別けて構造体化にしろ
すいません質問の仕方が悪くて。 アドバイスを参考にやってみます。
もうくるなよ。
C言語で長門がやってたみたいにゲームの改造とかできますか?
おまえ、気持ち悪いよ 生きてる価値あるの?
日本語でシェークスピアみたいな文章が書けますか?みたいな質問だな
>>666 気持ち悪いとか生きてる価値があるかそういうことは置いといて
質問に答えてください
>>668 できます
のこぎりで家を建てられると同じような意味で
はてなとか、教えてgooみたいなポイント制のサイトにいけば気持ちよく質問できると思うよ。
改造を支援するツールは作れる
厨が何を言っとる
釣堀だな
676 :
デフォルトの名無しさん :2008/10/26(日) 04:31:01
既出かもしれませんが、教えてください。 ソースの読解、解析が早くなるためにはどうしたらいいですか? やはり経験と量でしょうか?
入門編ネタ → 過剰専門ネタ → 門前払ネタ なにこの数日間の落差
君は何か期待でもしてるのか?
>>676 定石を知ること。
最近はいろいろ便利なツールもあるのでその辺を使うこと。
その上で、経験と量じゃないかな。
681 :
デフォルトの名無しさん :2008/10/26(日) 08:47:20
友達からC++のプログラムもらって家でコンパイルしたら strcpy_s()関数が使えません、という警告が出て、コンパイルが成功しませんでした。 調べてみたらstrcpy_sはstrcpyの拡張版らしくて、うちのコンパイラが若干古いので、strcpy_sは使えないみたいなんです。 それでプログラムのstrcpy_sをすべてstrcpyに置き換えたら、またエラーが出ました。 strcpy_sは引数の数が三個で、strcpyは二個なんで、その警告が出ました。 strcpy_sを、strcpyと同様の動作をさせる関数として定義すればうまくいくと思ったのですが、どのような関数を定義すればよいでしょうか。
>>676 確かに定石は重要。これは本家の囲碁の世界でも同じ。
ただし定石は「覚えて忘れる」ものです。
>>681 スレ違い。ここはCスレ。開発環境ごとのスレにでもどうぞ。
C言語を自宅でも練習したいのですが、 Cを実行できるソフト(例えばVBなど)で、 CドライブではなくDドライブにインストールできる無料のソフトはありませんか?? EeePCを使っているのですが、Cドライブの空きが700MBと少なくVBはインストールできませんでした。 よろしくお願いします。
686 :
デフォルトの名無しさん :2008/10/26(日) 12:14:42
VC++
VC++も同じく、Cドライブに必要な領域が足りません。。 ダウンロードサイズ自体は小さいのですが、、
688 :
デフォルトの名無しさん :2008/10/26(日) 12:27:47
Dドライブにインストールすればいいだろうが。おまえアフォ?氏ね
VCはインストール先を変更してもCドライブに数百メガのファイルをコピーするよ。 M$製はあきらめて、CygwinとかBccとかにするしか無いだろな。
それが、インストールのとき参照からDドライブに入れるって選択しても、 Cドライブに必要な領域が少し減るだけです。。
Cドライブの総容量って何ギガあるんだ? 場合によっては、ユーザープロファイルフォルダをDに移すことで Cドライブに用量を確保できる可能性もある。 やり方は、該当板で。
692 :
デフォルトの名無しさん :2008/10/26(日) 12:40:17
すなおにPC買い替えろ
PCを買い換える金銭的余裕が無いです… CygwinとBccに当たってみます。
コンパイラだけ入れたら? Dドライブとして使ってるデバイスをCドライブのどこかのフォルダに マウント(orジャンクション作成)してもいいけど。
>>685 Virtual PCとかVMなんとかみたいな仮想環境をDドライブに構築して、それにインストールするとか。
WindowsをDドライブにインストールすればいいんだよ。
Cドライブのエロ動画を消すかDドライブに移動させろ
698 :
685 :2008/10/26(日) 13:45:26
>>694 コンパイラだけとか入れれるのですか!?
それが一番いいですね。調べてみます。
>>695 仮想〜ていうのが少し勉強不足で分からないです。。
>>696 もう1回一からPCを立ち上げ直すってことですか?…
>>697 このPCのCドライブにはデフォルトのプログラム関連のファイル以外入ってないです。
元々Cドライブには最大で3GB強なもので
パーティションきりなおせ
PCの使い方も知らない奴がEeePC使っている時点で間違いだろ。
C以外にでかいのがあるならCにマウントしてマイドキュメントとかページファイルとか移してしまえばいい
windowsが使いやすすぎてLinuxとかまったく覚えられないのですが、どうすれば改善されますか?
Macを使えば改善されるよ
併用すりゃいい もっぱらWinからTeraTermとftp使ってviやemacs慣れるまでは Windowsでファイルいじればいいし。
C言語でウェブページにアクセスしたらアクセスしたパソコンのローカルIPを ウェブ上にあなたのローカルIPはこれこれですって表示することは可能ですか? 何がやりたいのかというとMS-DOSのipconfigをたたいときの動作をウェブページでできるかということです
接続してきた人のIP表示するcgi作るってことでいいのか? 可能だよ、一応
接続を受けた時のsockaddr_inを見ればいいんじゃね
日本語でおkだな
>>685 Windows2000、XP、Vistaなら、C:\Program Filesフォルダ゙を圧縮しなさい。
インターネットは全く関係なく、単にウェブブラウザで表示したいだけというような気がする。 つまり、必要な情報をWindows APIか何かで取得した後, HDDにHTMLで吐き出して、それをブラウザで表示させればいいのではないだろうかということ。
LAN内だけなんじゃないの
C言語を記述するために特化したエディタを作りたいのだけど、 どんな機能が必要でしょうか?
>>714 仕様を書いたら自動的にプログラムを書いてくれるエディタ
>>716 タブ切替
シンタックスハイライト
自動インデント
入力補完
外部アプリケーションとの連携
タブを空白に、またその逆
行番号表示
関数リファレンス
他にもありますか?
タグジャンプとかinclude文にカーソル合わせてキー押すとヘッダファイル開いてくれるとか
>>717 ある程度は秀丸でC言語設定すればやってるからなあ。
VSのようなおせっかいは返ってゴメンだし。
ソース検索はそれなりにツールあるし。
F2キーを押すと #include < まで表示 F3キーを押すと #plasma まで表示 F4キーを押すと switch() case default まで表示 など、よく使うものがポンと出ればいいんだ。
>>719 VSがおせっかいと言えるくらいに僕も早くなりたいです。
大槻教授専用
一応聞いておくけど、スタディとして作りたいんだよね? そうでないなら既存ので十分
インテリセンスはおせっかいですかそうですか
括弧の上で%を押すと、対応する括弧に飛ぶ機能 ぐらいかな
将来Dark_AleX氏のようなハッカーになりたい
727 :
707 :2008/10/27(月) 21:24:09
>>709 勉強不足でわかりませんが、チャレンジしてみます
>>712 エスパーしていただいて感謝してます
そのとおりです
右側のスペースを削除する方法について質問させてください。 OS WindowsXP IDE VC2008 char* RightTrim ( char string[] ) { static char buff[MAX_SIZE]; char *dest = buff; char *p; int len = strlen ( string ); p = string + strlen ( string ) - 1; for ( ; len > 0;len--, p-- ) { if ( *p == '\0' ) { break; } else if ( *p != ' ' ) { *dest++ = *p; } } *dest = '\0'; return ( &buff[0] ); } } 出力される値を、逆順に並び替えてあげればうまくいくのですが、効率が悪くいい方法があるのではないかと考えています。 引数の値はそのままで、戻り値に右側のスペースを削除した状態(逆順ではなく)で文字列を返すにはどうしたらいいでしょうか? よろしくお願いします。
コードかくのめんどいので 文字列終端から調べて、スペースだったら'\0'をどんどん左へもっていくカンジで
730 :
728 :2008/10/27(月) 23:27:16
>>729 さん
ご回答ありがとうございます。
早速作成してみましたので、見ていただけませんか?
char* RightTrim ( char string[] )
{
int i, j ,k;
static char buff[MAX_SIZE];
char *dest = buff;
char *p;
strcpy(dest ,string);
k = j = strlen ( string );
for ( i = 0; i < j; i++ )
{
if ( *( dest + k - 1) == ' ' )
{
*(dest + k - 1) = '\0';
k--;
}
else
{
break;
}
}
return ( &buff[0] );
}
destに引数の値を格納し、destのアドレスに変数 k を加算し、終端文字を入れていく感じです。
先ほどよりは、よくなりました。
実務レベルで使える関数でしょうか?
>>730 729じゃないけど、ローカルのstatic変数はどうかと思うよ。まぁ、あるといえばあるんだけど。
ソースになる文字列を変更したくないのであれば、デストになるchar型の配列(十分な大きさのある)を渡した方がいいと思う。
#include <string.h>
char *
foo(
char * destStr,
const char * srcStr)
{
size_t len = strlen(srcStr);
while ( *(srcStr + len - 1) == ' ' ) {
--len;
}
memcpy(destStr, srcStr, len);
*(destStr + len) = '\0';
return destStr;
}
732 :
728 :2008/10/28(火) 00:46:47
>>731 ご回答ありがとうございます。
引数をなるべく少ないほうがいいのかと思い、
>>728 、
>>730 のような形を使いました。
>>730 のプログラムでも戻り値を代入する際と、引数で
2つの配列を使うわけですから、一緒なんですね。
なるほど。
>ローカルのstatic変数はどうかと思うよ。
>デストになるchar型の配列(十分な大きさのある)を渡した方がいいと思う。
よろしければ、上記のメリット・デメリットを教えてもらえないでしょうか?
ソース参考になりました。
ありがとうございました。
static変数を使うとマルチスレッドで使えない。 必要がない限り、使うべきでない。
業務で使えるかどうかの判断ですが、引数の扱い、戻り値の扱いがプロジェクトのポリシーに沿っていて、かつ、 バグがない挙動をしていれば問題ないと思います。 パフォーマンスチューニングを行うのは正しく動作するようになってからです。 処理時間が1/10になる予定の、まだ動かない関数と、処理速度が遅いけれど正しく動作する関数の どちらが大事であるかということ、および、その関数の速度が速くなることで全体の速度にどれほどの 影響を与えるのか。 その辺を考慮していく方がいいですよ。
うそぉ。業務で使えるかって判断だったら>730はダメダメでしょ。 MTセーフじゃない時点でアウトだし、引き数のチェックが全くないわけだし。 # プロジェクトのポリシーによって、リリース版でもチェックするのかassertなのか色々あるだろうけど。
>>715 プログラミングって詳細な仕様を書いてるんじゃなかろうか?
むしろ自然言語で対話してコードを生成してくれるエディタとか
おにぃちゃん、なにがしたいの?
> セックス
おにぃちゃん、セックスってなあに?
> 男と女が(ry
おまえら作って下さい
スレッドセーフかどうかと業務で使えるかどうかの関連が俺にはわからん・・・。
スレッドセーフじゃない関数は、スレッドセーフじゃなくてもOKというコンセンサスが得られる業務じゃなきゃ使えないってこった。
せっかくならスレッドセーフだけじゃなくてリエントラントを目指そうぜ
結局プロジェクトのルールで決まってればスレッドセーフじゃなくてもいいってことじゃん?
そりゃそう 今作ってるクラスを顔も見たことがないような人に 後々使わせるんでもなけりゃ プロジェクトのコンセンサス次第
現実的にはプロジェクトのルールじゃなくて、どういうプログラムを作るのか、じゃないの?
APIを担当するのか、ソフト丸ごとを担当するのかでも変わって来るし。
C言語全然関係ないな。
>>738 mallocもそうだし、プロジェクトによっては標準ライブラリは何も使えないというケースもある。
(というかあった。わざわざmapファイル見て「これはだめ〜、これもだめ〜」とやった・・・)
結局ケースバイケース。
そもそも
>>730 の「実務で使えるレベルか」という質問がナンセンスだと思うがね。
ローカルにstaticの文字列を持って、それを返すって、お作法的にどうよって気がする。 マルチスレッドじゃなくてもバグの元になりそう。
>>743 標準関数でもctime()なんかが同じ戦略を使っている。
マルチスレッドじゃなくても、仕様を理解しないで使うミスは起こりやすいね。
例えばこんなミスはありがち。
--
time_t time1 = time(0);
sleep(1);
time_t time2 = time(0);
printf("time1:%s time2:%s\n", ctime(& time1), ctime(& time2));
2メンバーある(例えば構造体) うちの1つをキーとして、ソートする場合一番早い方法ってどんなのだと思いますか? データ構造も含めて、教えていただけるとありがたいです。データ数は20000ぐらいです。
基本的にキーとソートアルゴリズムが変わらない限り速度もまったく変わらない
やはりそうですか・・・ 構造体の配列をsort()でソートするか std::mapの値でソートするか迷ってたんですが
>>747 構造体1個の実態サイズはどれくらいか知らんけど
移動する必要ないやん。
構造体とリンクしたキー+ポインタ(もしくは配列番号)
を持っててそっちをソートすればいいだけじゃね?
typedef struct{ double weight; char name[128]; }Person; int My_Cmp_Person(const Person *a, const Person *b){ int result; if(a->weight == b->weight){ result=0; }else if(a->weight < b->weight){ result=1; }else{ result=-1; } return result; } 今は、 これでqsortしてます。
>>747 スレ違い。Cにはsort()なんて標準関数もなければ::なんて記述自体存在しない。
stdlibのqsortです
ポインタが指すintの変数を配列の添字にしたいのですが出来ますか?
それではポインタがint型の整数を指す場合(例えば1)、 int *soeji; int a[10]; printf("%d\n",a[*soeji]); こうやると配列a[1]の内容が表示されることになりますか? 後mallocなどで、多次元配列を確保したとき、多次元配列が指す変数も配列の 添え字にするときも 二次元の配列を確保したときとか a[**soeji[x][y]]; というかんじに添え字にするんですかね?
>>754 お前は何を言っているんだ。特に後半、意味が通じると思うのか?
756 :
753 :2008/10/29(水) 17:27:38
>>754 かなりいろいろ勘違いをしてる気がする・・^^;
int *soeji;
これはあくまでint型のポインタであって中身はint型の変数の場所
のアドレスが入るだけです。
なので添字としての数字を入れておきたい実体となるintが別途必要。
>こうやると配列a[1]の内容が表示されることになりますか? soejiが正しく値が1の変数を指していれば、なる >後mallocなどで、多次元配列を確保したとき、多次元配列が指す変数も配列の >添え字にするときも >二次元の配列を確保したときとか >a[**soeji[x][y]]; >というかんじに添え字にするんですかね? 日本語を話せ
mallocって皆さんなんて読んでますか?
エマロック或いはエムアロック。 決してマロックとは読まない。
まろしー
すっとマーロックって読んでました。 勉強になります。
C++ではニューと読む
ここはあえてメアロックとか読んで人とは違うことをアピールするんだ
mallocとそのまま読みます
発音記号を書いてみろ
>>761 アメリカ人ならマーロックって読んでいそう
マロキュー
ポインタ変数をmemsetで0で埋めてもヌルポインタが入っていないと期待してはいけないというのは分かるんですが callocを使ってポインタの配列を確保した場合も、その値をヌルポインタだと期待してはいけないということでいいんでしょうか? callocは0埋めに過ぎないらしいのでそうなんだろうと思っているのですが
>>768 memset()で0を埋めてもNULLにならない処理系なら、calloc()でも同じこと。
>>769 やっぱそうですよね、ありがとうございます
もうどうでもいいことではありますが
×入っていないと期待してはいけない
○入っていると期待してはいけない
でしたすいません
>>770 >758-759の流れは読めてますか?
「皆さん○○をなんて読んでますか?」
「××或いは△△。決して□□とは読まない。」
これだけで、嘘と断じられてもねぇ。
c言語のいいエディタなんかある?
スレ違い失せろ ごめんなさいむしろ論争起こるので勘弁してください
サクラエディタ
emacs/xyzzy
emacsはクソ
>>754 > 後mallocなどで、多次元配列を確保したとき、多次元配列が指す変数も配列の
> 添え字にするときも
が
> 後mallocなどで、多次元配列を確保し、その多次元配列の要素が指す値を配列の
> 添え字にするときも
であるなら
a[soeji[x][y]];でいいよ。
そうじゃないならちょっとわからん。
vim厨の俺、参上!
/ // / // ______ / // / / // /| r'7\ ,.ヘ‐'"´iヾ、/\ニ''ー- 、., / / / / | |::|ァ'⌒',ヽ:::ヽrヘ_,,.!-‐-'、二7-ァ'´|、__ `'ー-‐''" ヽ、_'´ `| |:::::|'" 二.,_> ,.へ_ / //__// / / / `ヽ7::/ か っ | / // メ,/_,,. /./ /| i Y // ァ て だ. |'´/ ∠. -‐'ァ'"´'`iヽ.// メ、,_ハ , |〉 | 約 か ヽ! O .|/。〈ハ、 rリ '´ ,ァ=;、`| ,ハ |、 / | 束 ら > o ゜,,´ ̄ . ト i 〉.レ'i iヽ|ヽ、.,____ | し 止 / ハ | u ,.--- 、 `' ゜o O/、.,___,,..-‐'"´ | た め | / ハ, / 〉 "从 ヽ! / | じ て |,.イ,.!-‐'-'、,ヘ. !、_ _,/ ,.イヘ. ` ヽ. ッ .ゃ . |/ ヽ!7>rァ''7´| / ', 〉`ヽ〉 ! ! な .', `Y_,/、レ'ヘ/レ' レ' い . ヽ、_ !:::::ハiヽ. // / で ./‐r'、.,_,.イ\/_」ヽ ', / / す / `/:::::::/ /,」:::iン、 / / 〈 ,,..-‐''"´ ̄ ̄77ー--、_\.,__ / ,.:'⌒ヽ ´ | | , i |ノ `ヾr-、
独学でC学んでる俺にはこのスレの存在は非常に助かる 荒らすのだけは辞めて欲しい
こんなスレ早く卒業してね
viだろ普通。
いまどきviって(プ
基本だよね
案外少ないQX派
なにそれ
俺、秀丸
誰が自己紹介をしろと
792 :
デフォルトの名無しさん :2008/10/30(木) 02:27:17
Cでプログラミングする上で、基本的なライブラリがあれば教えてください。 やりたいのは、ハッシュや可変長文字列の取扱いなどです。 GLibでもいいのですが、できればBSDライセンスのものを探しています。
グローバル変数として定義した変数、例えば"int X"があって、さらにある関数内で"static int X"と定義した場合 その関数内でだけXはローカル変数になるといっていいんでしょうか? あと、グローバル変数なら自動変数でも静的変数にするのとそんなに違わないんですか?
じゃ、printfは何て呼んでます? 僕はプリントエフですが
>>793 グローバル変数の"int X"とある関数内で定義された"static int X"は別物
なんとなくだけどグローバル変数につけるstaticの意味かんちがいしてないだろうか
ブイアイエムってよんでます。ヴィムといおうとしてもビムってなっちゃうから〃><〃
mallocはなんて読む?麻呂はマーロックでおじゃるが これが好きでおじゃる。
面白くないよ?
お前を面白がらせるつもりは無いよ?
だから何?
少し前の話題を改めてふりなおす麻呂のことはなんて呼ぶ?
面白くないよ?
>>793 >グローバル変数なら自動変数でも静的変数にするのとそんなに違わないんですか?
・プログラムを構成する c ファイルが一つだけで、
・そのcファイル全体で読み書きできる変数を「グローバル変数」と呼び、
・static をつけて宣言する変数を静的変数と呼び、
・static をつけないで宣言する変数を自動変数と呼んで
いるのなら、
>>793 さんのいうことは「正しい」と思います。
外部変数にstatic をつけると、その変数の通用範囲は現在コンパイルされつつあるソースファイルだけに限定されます。
プログラムを構成するファイルが1つだけなら、外部変数にstatic がつく場合とつかない場合の差はないと思います。でも、
「グローバル変数」という言葉が微妙です。
また static をつけないで宣言する変数をすべて自動変数と呼んではいけません。
言葉の使い方が怪しげなのも、c の変数がどこに確保されるか、という点まで学習が及んでいないせいでしょうね。
といってあせる必要はありません。今なさっている学習を継続していけば私の申し上げたいことも理解していただける日が来ると思います。
>>783 いまどきって、たかがスレが荒れたくらいで、残念に思う人たちばかりなんですね。
日教組?文部省?トヨタ?の思うツボに成り果ててしまったんですか。いいこちゃんばかりですか。
それはともかく、どんなにあれててもスルー力(って変な言葉、いったいなんですかね)が適当にあれば問題ないのでは?
>>799 ほー、しばらく見ない間に成長したんですねぇ。malloc()/free() を使うようになったとは感心感心。
>>743 だったらstrtokとか使うなよ
>>745 >>749 クイックソートのqsortでいいんじゃね?
並べ替えで動かす実態をポインタ配列 Person *array[NUM] にすれば軽いし。
>>806 ご大層なことを書く前に、レス番をよく確認してくれ。
>クイックソートのqsortでいいんじゃね? ぉぃぉぃ >並べ替えで動かす実態をポインタ配列 Person *array[NUM] にすれば軽いし。 プ
scanf()が、絶対にオーバーフロー起こすというので 絶対にオーバーフロー起こさないscanf()の使い方提示したはずなんだけど忘れちまった 誰か覚えてね? たった2行くらい付け足すだけで、そう大したことしてなかったはずなんだけど
2行じゃねえな 入力受け取りの際に数えてオーバーフローしないようにしたはずなんだ scanfなんか使わないから忘れた でもこうすりゃscanfは入力のときからオーバーフロー起こさないぞってのを証明したはずなんだ
%s使わなきゃscanf使ってもオーバーフローしないよ しないよ
マロック カロック リアロック
英語のサイトを調べてみた malloc - mah lock malloc - mall-och malloc - malok printf - print eff printf - printf printf - print uff
マーロック マルォック マロック ってな感じ?
allocate 割当てる / allocation 配当 といった意味でしょうに。しかし、malloc , calloc , realloc と allocの前は何でおじゃるか?
>>817 メモリー
clear
re 再びとかの意味の接頭語
>>807 誰だよお前、このスレには、
>>799 より前に一度も足を運んだことがないでおじゃるよ?w
宿題スレでクソースのリストを書いたのは、もう去年の話でおじゃるが
そのとき、mallocは使ってたでおじゃるよw
820 :
デフォルトの名無しさん :2008/10/30(木) 13:33:45
winでvc++使っているCしか知らない者ですが 現在時刻を標準出力にどうやって表示するんですか? お願いしますm(__)m
822 :
820 :2008/10/30(木) 13:41:18
戻り値 time_t ってどういう意味ですか?
>>822 構造体
time_t
でぐぐれでば解説でてくるよ
824 :
820 :2008/10/30(木) 13:44:35
>>823 すいません携帯から何でその辺辛いです(´・ω・`)
>>824 じゃあPCが使えるようになったらやれよ。
それ以上解説させる気かよ
827 :
820 :2008/10/30(木) 13:52:01
time_t は時刻を表す型 difftime で差を計算したり ctime や strftime で文字列に変換したり localtime や gmtime で年月日時分秒に変換できるが、 その実体は謎に包まれている
>>828 > time_t は時刻を表す型
> その実体は謎に包まれている
残念。実態はただの整数で、応じた関数では秒数の値が入る。
その秒数をもとに、年月日を表している。
当然、時間を取得する関数を用いなくても、time_t型に
ユーザが任意の値を指定することは可能。
Cの規格にはそんなこと一言も書かれていないので (時刻を表す算術型、とだけ書かれている) 処理系に依存した移植性の低いプログラミング作法といえる
算術型って書いてるじゃねーかw
typedef long time_t; typedef unsigned long time_t 環境によるが、ヘッダにはこういった型の定義がされているはず。 単純に整数型の変数で、とりわけそれらを標準的に扱う関数は ある基準の日時から経過した秒数として扱う。
mallocは「malloc」と読んでいます。
算術型って double も入るだろ?
2^31秒だと、約68年。1970年1月1日0時0分0秒からの経過した秒数を扱う場合 2038年問題があったというのはかなり前の話。今はそれも対策されていて 2000年問題みたいなことにはならん。
話がなんか噛み合ってないようにも見えるけど
つか、VC++ 使ってるなら MSDN 見ろよ、って話だ。
>>831 解らん奴だな。数値ではあるが、算術演算の結果がどうなるかは定義されてない。
…とはいえ、POSIXではその辺は定義されてる。ので、
「移植性が低い」とまでは言えない希ガス。
838 :
820 :2008/10/30(木) 14:21:28
プログラム云々はともかく、何事も電子計算機で扱っている基本は 不動少数も含めて、0と1の組み合わせで表される変数。
>>840 そんな自分が扱っているものの基本も分からんようなら
プログラミングなんてやめた方が良いってこと。向いてないから。
自分は大学で、論理回路にしろ、2進数の仕組みにしろ
電子計算機の内面に関する学部には所属していなかったが
実験ではやったし。
へーすごいね。 で、だからなに?
ごめん、分かりやすくいってあげた方がよかったかな 突然なんでそんな関係ない話始めたの?馬鹿なの?っていってあげたほうがよかったかな?
心配しなくても一世代二世代前でそのポジションにいる人間はみんなやってる ゆとりが格別ダメなだけ さあ早くC言語の質問に戻るんだ
>>840 0と1って知っている?知らない?聖徳太子(ry
なんでそもそも、物質で言えば構成している最小単位の
分子、原子レベルに当たる、デジタル世界での最小単位が
0と1か知ってる?知らない?電気信号の基本と言えば
何かと身近な電池でも知ることが出来る + と - なんだよ。
その2つのパターンを組み合わせて、単純ではあるが複雑な
表現に置き換えているんだが、俺は人間の中身が内臓であるように
そういう内面的な部分が頭に浮かんでしまい、どうも
ギャルげーとかやっている連中が理解できない。
あの色だって、ハードウェアが高性能になって、表現できる色数も増えたが
内部は0と1のバイナリーデータなんだぜ?
>>843 > 馬鹿なの?
お前がな。低●乙。レベルが低い奴の話は要らないよ?
ここは入門スレだが、基本も知らない奴は論外。
どの言語でも、扱っているハードウェアの基本、変数は
必ず関与してくるし。例え文字だけでも、その文字の実態は
文字コード体系に基づいて、数値によって参照されているもの。
そして、文字を構成している、点の集まりだって。
gets ってどんなとき使うんですか?
教科書とかマニュアルとかでは使うなって書いてあるし、
その危険性も分かるんですが、だったら何のためにあるのかと。
fgets では駄目な場面って、あるんですか?
スレ内検索してみたけど
>>76 によるとそういう場面もあるみたいですが。
(´-`).oO(基本も知らない奴は論外なのに、なんで基本を語り始めたのだろう)
>>847 ありません
みため一番簡単だから教書等で使われることがあるだけ
getsはバッファオーバーランをどうやっても防げないので使うべきじゃない
>>76 がいってるのは多分、自分でしか使わないとか
入力しすぎる危険がないとかそういうケースなら使っても問題は起こらないとかそういう意味だろう
普通に使う IFやら、OR、AND、NOT、それらを拡張したXOR、NAND、NORなど、 これらも基本は単純。NOTを組み合わせるだけで、色々なものが出来るってのは 周知のこと。否定の否定は肯定だし。それが通用するのも、0か1だから。 だから基本から考える人は、賢い。複雑になったものを、あーだこーだ言っても面倒。 0を否定したら1なんだよ。しかし、人間は複雑な生き物でな。 あいつが好きでない=嫌いではないんだ。べっ、別に振ったわけじゃないんだから かっ、勘違いしないでね ♥
ええと・・・もう終わりましたか?
基本云々ていうか 誰も聞いてないのにいきなり0と1がどうとか言い出したから いきなりどうしたの?って聞いただけだろ
『C言語撃退塾 - K&Rは置いて、俺の話を聞け』って本を見つけたのですが、入門書としてはどうですか?
854 :
847 :2008/10/30(木) 15:26:20
>>849 そっかー無いのかー。
じゃあ単に昔の名残というか、互換性のためというか、そんなことなのかな。
いっそのこと gets って関数を規格から無くしてしまえばいいのにね。
でもそれはそれで問題ありなのかな・・・。
とにかく、ありがとうです。
(σ・∀・)σゲッツ!!
____ / \ / ─ ─\ / (●) (●) \ >>ゲッツ! | (__人__) | / ∩ノ ⊃ // ∩ノ ⊃ ( \ / _ノ \/ _ノ .\ “ / . \ “ / \ / /\/ \ \ \ \ \ > > > / / /
857 :
デフォルトの名無しさん :2008/10/30(木) 16:01:34
標準Cライブラリを使わずに書くことにどんな利点がありますか?
勉強になる
標準Cライブラリをリンクせずに済む
他人の作ったコードは市ね 全てを最初から 神様気分
864 :
デフォルトの名無しさん :2008/10/30(木) 16:39:20
言語レベルで会計みたいに三桁ごとに カンマを打って演算できる型や機能ってある?
演算中にカンマは必要ない 結果を表示するときにカンマを打って表示すればいいだけ
>>864 意味がわかりません。
表計算の機能から想像でいってる風だけど。
あれはあくまで最終の表示で書式使ってカンマつけてるだけで
内部はそんな持ち方してない(はず
867 :
デフォルトの名無しさん :2008/10/30(木) 16:43:42
>>865 それは自分で関数作って表示するの?
それともそういうこと出来る機能があるの?
>>865 標準ではない。
独自の実装では用意しているところもあるかもしれない。
自分で作るとしても大して難しい処理ではない(スタディとして出されることがあるくらい)
三次元の大規模な配列をcallocで以下のようにして作って main() { int ***matrix; int i,j; matrix = (int ***)malloc(sizeof(int**)*10); if (matrix==NULL) exit(1); for (i=0 ; i < 10 ; i++) { matrix[i] = (int **)malloc(sizeof(int*)*10); if (matrix[i]==NULL) exit(1); for (j=0 ; j < 10 ; j++) { matrix[i][j] = (int *)malloc(sizeof(int)*100000); if (matrix[i][j]==NULL) exit(1); } } /*解放*/ for (i=0 ; i < 10 ; i++) { for (j=0 ; j < 10 ; j++) { free(matrix[i][j]); } free(matrix[i]); } free(matrix); } 例えばmatrix[0][1]+1の内容をmatrix[0][1]に代入したり、 matrix[0][1]の値を配列の添え字(matrix[0][0][添え字])にする場合はどのようにすれば良いのでしょうか? 多次元配列の動的確保のやり方を紹介しているサイトには普通の配列と同じように操作 できると書いてあったのですが、matrix[0][1]=matrix[0][1]+1;とすると、代入 互換性のない型とエラーがでてしまいます。
870 :
デフォルトの名無しさん :2008/10/30(木) 17:15:17
それまで標準出力に表示されていたものを一新し、 改めて更なところに、その後の処理を表示させたいんですができますか? 自分は\fで出来そうな気がしたんですがダメでした
>>869 matrix[0][1] の値ってなんだ?
matrix[0][1][0]〜matrix[0][1][99999] の1行全体って意味か?
それを添え字にするとは??
>>869 まず、以下の二つの違いがわかっているか。
1. 多次元配列
2. 多次元配列をまねたポインタの配列
君がやろうとしているのは後者である。
つまり、matrix[0][1] はポインタであるから、これは(型が正しければ)好きなように代入することができる。
もちろんそこに代入されているものが動的に確保された領域へのポインタなら、それは危険を伴う。
一方で、ポインタであるということは、その値を配列の添字に使うことはできない。
配列の添字になれるのは整数だけである。
最後に、上記の前提に沿えば matrix[0][1]=matrix[0][1]+1; はまったく正しい計算である(メモリ管理上の問題はあるが)。
それにコンパイラが文句をつけるとすれば、君がまったく間違いをしていないなら、きっとそのコンパイラは壊れているに違いない。
>>870 \fでできないなら、たぶんできない。
あるいは必要なだけ空の改行を出力してそれまでの結果を画面から押し流す。
874 :
デフォルトの名無しさん :2008/10/30(木) 18:08:57
876 :
デフォルトの名無しさん :2008/10/30(木) 18:45:18
877 :
793 :2008/10/30(木) 19:01:53
>>805 最近関数の勉強を始めたばかりなので正しい表現じゃなかったと思いますが、
言いたいことは伝わったみたいでよかったです。ありがとうございました。
また疑問ができたのですが、自動変数を初期値を与えずに定義したとき
それがmain関数の場合と普通の関数の場合とで何が違うんでしょう?
とりあえずmain関数の場合は勝手に0にしてくれるみたいなんですが・・・
>>877 たまたま
スタックはみんなで使いまわすから、mainでたまたままだ誰も使ってなかっただけかもね。
プロセスが生成されるときのスタックはゼロクリアされる てBSDの本で読んだ気がする だからといってmainまでに何があるか分からないし 何の保障にもならないけど
>>819 へー、それはみたことない。
過去ログが手元にありますから、URL 示してくださいな。記憶に間違いがなければ uploader は使わないたちだったかと。
>>877 あなたの思う「自動変数」ってなんでしょうか?それによって答えは変わります。
わたしが「自動変数」といういうときには、その初期値は不定です。それが main() であってもなくても。
>>879 本当ですか?fork() の内側で auto な変数が全部 0 にて、ちょっと考えられないのですが。
>>850 はやく fp と fd の違いについてレポートを出してください。
>>846 はやく fp と fd の違いについてレポートして下さい。
>>845 早く fp と fd の違いについてレポートしてください。
886 :
デフォルトの名無しさん :2008/10/30(木) 20:13:12
>>860 リンクしない事の利点は?
リンクしない事の利点は?
リンクしない事の利点は?
リンクしない事の利点は?
リンクしない事の利点は?
リンクしない事の利点は?
ねぇ答えてよ
>>883 > はやく fp と fd の違いについてレポートを出してください。
???日本語でおk?っつか、何お前の方から、直接関係も無い
相手を揺さぶるような、試すような課題を勝手に課してんの???
お前何者?どこかの低レベルな学校の講師?孔子?(プ
> fp と fd の違い fは同じだが p と d が違う。だから何なんだよ?w んで、お前の答えは?お前こそレポートしとけよ。答えが無い あるいは自分が頭で考えたことをエスパーしろっつー ガキっぽい幼稚なことはするなよ、大人になってみっともない。
今日も日本は平和です
あるプログラムを組みたい時プログラムのパターンがいくつかある場合、やはり優劣はあるのでしょうか? また、優劣がある場合、その優劣はプログラムに慣れていけばわかるものですか?
何を持って優劣とするかによる 実行速度ならば処理に掛かる時間を計測すれば良い コードの保守性があるという意味なら慣れは大事
893 :
デフォルトの名無しさん :2008/10/30(木) 20:58:32
何を持って優劣とするかによる コードの保守性があるという意味ならば保守性をを計測すれば良い 実行速度なら慣れは大事
おもしろくないよ
895 :
76 :2008/10/30(木) 21:06:50
まさか今頃引っ張られるとは思いもしなかった。 別プロセスの出力をパイプで受け取る場合なんかを想定して書いたよ。
>>894 おもしろくしようとしてレスしてる訳じゃないだろ?常識的に考えて
違うと思うならお前がおもしろくさせろ、な?
皮肉とジョークの違いの分らないやつがまたひとり。
ちなみに「面白い!」と勘違いして面白くないレスをする奴に一番よく効くのは「スルー」です
>>889 何でそんなネタ回答しちゃったの。
スレ的にはファイル構造体を指すポインタとファイルディスクリプタを思い浮かべて当然じゃないか?
>>881 単に、int xのように書けば基本的に自動変数になると認識しています。
autoは省略しても良いとありました。
確かに自動変数は初期値が不定だという説明があったのですが、
main関数内の変数は0に初期化されユーザー定義関数内の変数はそうならなかったという次第です。
頭の中に索引情報だけを残す人間が増えましたね(笑)
>>903 全部覚えるには容量が足りないからしょうがないよ
>>902 たまたま0クリアされているだけ
そういうことに頼ってコードを書いてはいけない
あとstaticがautoと対応するのは関数内宣言だけであって
関数外ではまったく意味が異なる
>>808 つかわねーよ。
strtok()なんて、筋悪でゆうめいじゃん。
フラグは1か0の値しかとらないとき フラグAが1、かつフラグBが0のとき という条件は if (flagA = 1 && flagB = 0) と、自分は書いたのですが &&を用いずにこの条件を表現できるそうなのですが どうすればいいのでしょうか?
志村条件間違ってるー
>>907 if (flagA - flagB == 1) かな?
if(flagA==1 && flagB==0) でした、すみません こんな雑魚な俺ですが、&&を用いない表現があればおしえてください
>>909 なるほど
ということは両方1のときはflagA + flagB ==2
両方0のときはflagA + flagB ==0とすればいいんですね!
ありがとうございます、本当に助かりました
>>901 昔からそうでした‥‥‥。
でも宿題スレでコードを書く意志はあるようなので、一定の評価はしていますし、まずかったらまじめにみてあげようと思ってはいるんですけれども。
913 :
891 :2008/10/30(木) 22:54:38
>>901 お前の精神レベルが低過ぎるだけ。気づけよw
何でいきなり質問してんの?自分知ってるの?って逆に言われるよ。
相手を揺さぶるつもりが、自分がバカだと露呈する奴は
2ちゃんねるの他のスレを見ても分かる。下らない質問をしている奴
そして罵倒、煽りをする奴は精神レベルが低いんだろうね・・・
もし大人だったら、最悪だな。本当の子供だったら、まともな大人にはならんだろうね。
お前のように。
>>912 自作自演しなくて良いよ。お前はいい負けして悔しかったんだろうね。
そう、お前は電子計算機の基本を理解していない、そうだろ?
しかし、目の前の汎用電子計算機の内面的な仕組みは
どれも0と1の組み合わせは言うまでもないよ。そんなことも知らないなら
それを操るプログラミングなんてやる前に、仕組みを習った方がマシ。
社会に出るなら、一般常識を学んだ方がマシと同じように。
妙な知識ばっかり身に着けて、肝心の一般常識がなっていない
勘違い野郎は、どこか抜けていて通用しない人間になるんだよな。
あっ、だからこんなボランティアにもならんスレで、初心者相手に
自分は出来るぶってるんだw
こんな時間に長文書いて大変だねぇ 今日は冷えるから早く寝るといいよ
>>883 お前がはやく fp と fd の違いについてレポートを出してください。
なんでこんな問題がいきなり出たんだ???
そこからして分からんが、知っていても答えないよ、お前にはw
いきなりfpだのfdだの言い出したり それに意味不明なファビョりかたしてる子はなんなの? 頭おかしいの?
>>870 キャラクタベースで画面表示をリアルタイムで更新したいならcursesを使えば可能だよ。
viやemacsのようなテキストエディタも作れる。
っつかさ、相手を試すつもりがあるのか知らんが、答えろよ答えろよって 何様だよ?このスレでも、態度の悪い質問者なんてまともに相手にされないだろ。 なに厚かましく答えを要求してんだよ?知りたきゃ自分で調べたらぁ?w
うぜえ よそでやれ
こんな任意で答えるスレで、相手の素性も分からない見えない人に対して 相手を指定して答えを必死に求める奴って、何考えてんの?w そこからして、自分がおかしなことをしているって気づいてね ♣ さて、次スレでがんばってね、fpとfdの違いも分からない回答者さんw
気持ち悪いななんだコイツ 何と戦ってるんだ
ほんの僅かでも自分に批判的な意見が出ると 場所もわきまえず相手がとっくに消えたにも関わらず 徹底的に罵倒せずにはいられない 典型的な頭おかしい人の症状です
ほんの僅かでも自分に批判的な意見が出ると 場所もわきまえず相手がとっくに消えたにも関わらず 徹底的に罵倒せずにはいられない 典型的な頭おかしい人の症状です
大事なことなので二度言いました
928 :
デフォルトの名無しさん :2008/10/31(金) 00:22:18
プロトタイプ宣言と関数宣言ってコメントの違いって何? prototype declaration function declaration
日本語でおk
930 :
デフォルトの名無しさん :2008/10/31(金) 00:40:42
>>829 原型宣言
関数宣言
/* Global prototype */
/* Global functions declaration */
皆さんならどちらをコメントに使いますか?
理由も教えて下さい
どっちも使わない そんなものコメントに書く必要がない
自明なものはコメントにしないな
933 :
901 :2008/10/31(金) 00:46:49
934 :
デフォルトの名無しさん :2008/10/31(金) 00:51:36
そりゃ必ず書かなければならない方
俺ならそのルールを決めた人間と話し合う。 それはそうと変数は全て0か1で表されていると意気揚々といってる彼(せめて男であって欲しい)は BIOSなどをを抜きにしてすげえ上位レイヤーに限定してるけどいいのかな。
>>936 > 意気揚々といってる彼
ごく当たり前のことをそう思えるお前がばかばかしい。さすが大学にも通わなかっただけあるね。
> BIOSなどをを抜きにして
出たよ、自作板にもいるね、BIOSをいじれるだけで得意気に話すバカw
お前はBIOSの設計からするのか、ほぉすげーすげー。職場が違いすぎる。
それはもうハードウェア関連が主な業務だろうね。プログラミングに向いてないよ、あんた。
>934 そんな職場やめる
>>936 反論すればするほど、自分がいい負けして悔しかったのが露呈されて涙目だな。
さすがに第三者からして見ても、お前も恥ずかしい。スレタイ読めない?
BIOSってC言語だったんだ・・・アゼンブラやスクリプト、インタープリタって聞いたことある?
場違いだからBIOSの話をする板にでもいけ。実にうざってぇ。
ねーママなんでこの人何度も何度もレスするの? なんでいっぺんにまとめないの?
>>939 C言語じゃないと0か1で表現されないの?
多次元配列を参照渡しするときの宣言ってポインタ型ではだめなんですか?
>>937 すまんすまん。
で、そのごく当たり前のことを話し出した理由は?
>944 Cに参照渡しはない。参照渡しを真似るときには、いつもポインタが渡される。
もうそろそろスレ終わるから遊んでもいいかなって思ったんだ。 ごめんね。ひさしぶりだしちょっと懐かしかったんだ。。。 でも、いつもの彼なら4時くらいまではたぶん勝手にレスしまくってると思うよ。
839 名前:デフォルトの名無しさん 投稿日:2008/10/30(木) 14:24:21 [sage] プログラム云々はともかく、何事も電子計算機で扱っている基本は 不動少数も含めて、0と1の組み合わせで表される変数。
scanf("%d",&a); 整数でなく、実数を入力したときにメッセージを表示したいのですが どういう条件文を書けばいいですか? なお、scanfにはこだわってません。整数を変数aに入れられれば良いです。
>>939 アゼンブラって聞いたこと無いわ
詳説よろしく
>>951 fgets()とstrtol()とかでやっていた頃が僕にもありました。
956 :
デフォルトの名無しさん :2008/10/31(金) 01:36:59
学校の授業においてはコンパイルする際に gcc と打つ奴を使っているのですが、 現在自宅においてはborlandを使っております。 課題のソースファイルを実行したいのですが、どのようにすればいいのか分からなく困っています。 ソースプログラム自体はできております。 授業においてはmakefileを使用して、makeとやってコンパイルしていたのですが borlandにおいてはどのようにすればいいのかご教授お願い致します。 下記がmakefileの中身です。 CC = gcc CFLAGS = -g -Wall OBJS = kadai2.o stack.o TARGET = kadai2 $(TARGET) : $(OBJS) $(CC) $(CFLAGS) -o $@ $(OBJS) kadai2.o: kadai2.c stack.h stack.o: stack.c stack.h clean: \rm -f *.o $(TARGET)
ご丁寧にググってくださり有難う御座います。 CCとCFLAGSの所を変えてなんとか実行できました。
どういたしまして
>>930 個人的には、プロトタイプ宣言、でしょうか。
それはそうと K&R2 の付録Aの中でプロトタイプ宣言のことを述べている場所を見つけられませんでした。どこ?
>>960 (A7) A8 A10をがんばって読むんだ
あーC言語むずい、鬱になるわ・・・
>>950 「不動少数」に突っ込んで欲しいのでは?
>>965 403
それにpdfなんてだすなよ。
テキストだけ抜き出せるだろ。
それに宿題丸投げスレも別にあるからそっちへいけ。
課題4-1 無限級数 以下の無限級数は0 < |x| < 1 の時に収束することが知られている. f(x) = ∞Σ i=0 xi (1) = 1 1 − x (2) 式(1) において,第N 項までの部分和で打ち切ることによって,級数の近似式が得られる.第 N 部分和により級数f(x) を近似するプログラムを作成し,適当なx (0 < |x| < 1) に対して,項 数N の増加につれて,部分和が真値1 1−x に収束していく過程を観察せよ. これをcであらわすにはどうすればいいでしょうか?
ひとつ前の最後の行も読まない剛の者現る。
まず数学の勉強からやれ
「makeしたら負けだと思う」
じゃあkatiで
有名大学に通ってる自分の周りですら、沢山いるけど 課題丸投げとか、カンニング、コピペ改編レポートで単位とる奴って何の為に大学に入ったんだろう
>>972 そうやって理系をこき使う能力を身につけるためでしょ?
日本の会社はそうやって他人を使う文系が重宝がられますw
なんで日本の技術者はストライキを起こさないの?
組合が無いからさ。
実装ミスが多いから
じゃあ組合つくれよ
#include "Part38.h"
/* /\* コメント *\/ */ 某エディタでコメントを入れ子にしようとするとこのようになります 何もせずに入れ子にすると不味いのはわかります \はどのような効果あるのですか?
983 :
デフォルトの名無しさん :2008/11/01(土) 01:38:34
/ ̄/ ̄/ ̄\./ ̄\ | | | || | \_\_\_/.\_/ 〈〈〈〈 ヽ | | | .| 〈⊃ }/ ̄/ ̄/ ̄  ̄/  ̄  ̄ \ ポインタのポインタのポインタのポインタ /| | .| / / ::\/ ::\:::/:: \ みたいな多重ポインタの意義って何。 ∩―−/ | .リ ,|/ / .<●/ .<●>::::::<●> \ あとキャストポインタの存在意義もわかんね。 / (゚) 、_ `ヽ ./ || | | (__人__) | ./ ( ● (゚) |つ _/ | \ \ \ ` ⌒´ / それがあることで何がどう得すんの。 | /(入__ノ ミ リ/,,― /,,― - /,,― -ー 、 , -‐ 、 、 (_/ ノ ,リ ( , ( , -‐ '" ) \___ ノ゙ / `;ー `;ー" ``;ー" ` ー-ー -ー'
巨乳の群れを見るとボインだのボインだのボインだのボインだみたいに連呼せずに一言多重ボインだ キャストボインだはアフロダイAに攻撃された機械獣が使う 貧乳に価値を見出す君には不要だ
いや、つまんないから
いや、つまんないから
何?悔しかったの?w
989 :
983 :2008/11/01(土) 02:44:51
で、俺の質問はどうなったんだ つまんねえレスの応酬ばかりせずにさっさと答えろよ スレ終っちまうから
何?悔しかったの?w
991 :
983 :2008/11/01(土) 02:47:52
うん
先生キャストポインタって何のことですか
>>982 ブロックコメントの開始と終了は/*と*/であって、
/\*や*\/はコメントの開始終了とは何の関係もない。
なので、ブロックコメントの中にあっても単なるコメントの一部とみなされる。
/*や*/でなくなれば構わないので\である必要はなく、
/a* *b/でもいいし、全然別の文字列に変換されても構わない。
\を挿入するのはそのエディタの作者の趣味だと思われる。
二番目のコメント開始はそのままでも大丈夫なので、
/* ... /* ... *\/ ... */とかでもいいかもしれない。
>>983 そもそも多重ポインタという認識がおかしい。
すべてのポインタは単に何かを指すだけのポインタでしかない。
そして関数を含めた全てのオブジェクトは、それを指すポインタ型を作ることができる。
だからポインタへのポインタも、ポインタへのポインタへのポインタも作ることができる。
ポインタの存在意義は何かを指し示すことであって、
指し示すものがある限り異議を失うこともない。
>1000までうめ
>>989 ポインタのポインタ・・・か
双方向リストが軽めだけどそんな感じになってるよ。
配列ではなく双方向リストを使う上でのメリットが
わかるとポインタのポインタの・・てのはわかるよ。
>>989 strtol()でも使ってみろ。「ポインタのポインタ」の存在意義が見えてくるから。
# 見えないとしたら、自らのセンスのなさを悔やんでとっととプログラミングからは手を退くことだね。
998 :
デフォルトの名無しさん :2008/11/01(土) 11:40:20
998 !!!!!!!!!!!!!!!!!!
999
1000なら文系は業界から去れ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。