C言語なら俺に聞け(入門篇) Part 50
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/06/30(火) 15:20:47初心者、初級者の方は他の質問スレのほうが良いかもしれません。
教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 128代目
http://pc12.2ch.net/test/read.cgi/tech/1245853701/
・C++言語はスレ違いですが、ある程度なら対応です。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 49
http://pc12.2ch.net/test/read.cgi/tech/1244297476/
過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
0002デフォルトの名無しさん
2009/06/30(火) 15:21:291000 名前:デフォルトの名無しさん[sage] 投稿日:2009/06/30(火) 15:17:35
char **ppCharx[] = {ppChar1, ppChar2, ppChar3};
↓
char **ppCharx[3] = {ppChar1, ppChar2, ppChar3};
これでだめなの?
0003デフォルトの名無しさん
2009/06/30(火) 15:22:19int main(void)
{
char *ppChar1[] = {"abc", "def", "ghi", NULL};
char *ppChar2[] = {"jkl", "mno", NULL};
char *ppChar3[] = {NULL};
char ***pppChar, **ppChary;
char **ppChar[3] = {ppChar1, ppChar2, ppChar3};
for (pppChar = ppChar; *pppChar != NULL; pppChar++) {
for (ppChary = *pppChar; *ppChary != NULL; ppChary++)
printf("%s ", *ppChary);
printf("\n");
}
return 0;
}
エラー E2063 strstr2.c 11: 不正な初期化(関数 main )
>>2
[]でも[3]でも同じエラーです
0004デフォルトの名無しさん
2009/06/30(火) 15:26:510005デフォルトの名無しさん
2009/06/30(火) 15:33:03エラー E2063 strstr2.c 11: 不正な初期化(関数 main )
警告 W8075 strstr2.c 11: 問題のあるポインタの変換(関数 main )
警告 W8075 strstr2.c 11: 問題のあるポインタの変換(関数 main )
0006デフォルトの名無しさん
2009/06/30(火) 15:36:470007デフォルトの名無しさん
2009/06/30(火) 15:41:10エラー E2063 strstr2.c 11: 不正な初期化(関数 main )
根本的に何やってもだめだと思いますよ
0008デフォルトの名無しさん
2009/06/30(火) 15:42:10初期化は,次のいずれかによって行わなければなりません。
定数式
グローバルな extern あるいは static 変数のアドレスに定数を加えた(あるいは引いた)もの
0009デフォルトの名無しさん
2009/06/30(火) 15:42:550010デフォルトの名無しさん
2009/06/30(火) 15:44:24本質的に判っていないのに無理に回答しなくてもいいと思います。
>>5
そのコンパイラは何? 手元のgccではc89準拠モードでもc++準拠モードでもc99準拠モードでもエラーにならないのだが。
0011デフォルトの名無しさん
2009/06/30(火) 15:44:48するなという事
0012デフォルトの名無しさん
2009/06/30(火) 15:47:15前スレでVC++ってなってたような
001310
2009/06/30(火) 15:47:39件のコードをc89準拠で-pedanticオプションつけたら警告が出た。
曰く、initializer element is not computable at load timeということなので、
古いcではダメと言うことらしい。
0014デフォルトの名無しさん
2009/06/30(火) 15:48:06CodeGear C++ 6.1.3(最新版)
確かにgcc4.4.0だと通りますね
こりゃコンパイラのバグかな?
0015デフォルトの名無しさん
2009/06/30(火) 15:49:08C89では正しい動作のようでした
安心しました
0016デフォルトの名無しさん
2009/06/30(火) 15:50:210017デフォルトの名無しさん
2009/06/30(火) 15:51:54というか記憶では今まで出来た試しがないのでエラーが出て
当然だと思っていた
001810
2009/06/30(火) 15:58:54#include <stdio.h>
int main()
{
static char * firstStrings[] = {"abc", "def", "ghi", NULL};
static char * secondStrings[] = {"jkl", "mno", NULL};
char ** stringArrays[] = {firstStrings, secondStrings, NULL};
int i;
for (i = 0; stringArrays[i] != NULL; ++i) {
int j;
for (j = 0; stringArrays[i][j] != NULL; ++j) {
int k;
for (k = 0; stringArrays[i][j][k] != '\0'; ++k) {
putchar(stringArrays[i][j][k]);
}}}
{
char *** p;
for (p = stringArrays; * p != NULL; ++p) {
char ** q;
for (q = * p; * q != NULL; ++q) {
char * r;
for (r = * q; * r != '\0'; ++r) {
putchar(* r);
}}}}
return 0;
}
0019デフォルトの名無しさん
2009/06/30(火) 18:46:06int main(void) {
char *ppChar1[] = { "abc", "def", "ghi", NULL };
char *ppChar2[] = { "jkl", "mno", NULL };
char *ppChar3[] = { NULL };
char **ppChar[] = { ppChar1, ppChar2, ppChar3, NULL };
char ***pppChar, **ppCharx;
for ( pppChar = ppChar; *pppChar != NULL; pppChar++ ) {
for ( ppCharx = *pppChar; *ppCharx != NULL; ppCharx++ ) {
printf( "%s ", *ppCharx );
}
printf("\n");
}
return 0;
}
ふとぅーに動きますよ?
エラーもでないし。んー質問の意図がわからにゅ。
0020デフォルトの名無しさん
2009/06/30(火) 19:01:19だからね、古いc(c89)ではエラーになるのよ。
具体的には、vc++のcコンパイラはc89準拠でしかないからエラーになるってこと。わかった?
0021デフォルトの名無しさん
2009/06/30(火) 20:07:23VC2008++だけど、エラーでないよ?
0022デフォルトの名無しさん
2009/06/30(火) 20:08:49Expressとかではエラーでるのかな?
0023デフォルトの名無しさん
2009/06/30(火) 20:40:38Cの原典K&Rには、こう書いてあったと言う話があったけど、
じゃあと思って、C++の原典『プログラミング言語C++』を
パラパラと見たら、0 <= x && x <= 10 というのがあった。
一緒に x >= 0 && x <= 10 という例もあったけど。
0024デフォルトの名無しさん
2009/06/30(火) 21:27:08試してないけど、Cとしてコンパイルしつつ、拡張を無効にしたらエラーになるかもしれないね。
エラーにすることがどうしてもできない場合はちょっとがっかりするね
0025デフォルトの名無しさん
2009/06/30(火) 21:40:02int n = -2147483648; じゃなくて
int n = -2147483647-1; って書かないといけない理由は何ですか
0026デフォルトの名無しさん
2009/06/30(火) 21:40:530027デフォルトの名無しさん
2009/06/30(火) 21:41:23そう言った人に聞けよ
0028デフォルトの名無しさん
2009/06/30(火) 21:45:15標準Cライブラリの実装本に書いてあったけど、話が細かすぎる。
とりあえず、-2147483648 なんて定数を直接使うのが間違っている。
#include <limits.h> の INT_MIN を使えばよい。
0029デフォルトの名無しさん
2009/06/30(火) 22:02:48いや、そのINT_MINがこうやって#defineされてるだろ
理由を昔聞いたのに思い出せなくて気持ち悪いんだ
0030デフォルトの名無しさん
2009/06/30(火) 22:03:40処理系依存
0031デフォルトの名無しさん
2009/06/30(火) 22:04:05%pとはなんでしょうか?
0032デフォルトの名無しさん
2009/06/30(火) 22:06:21Cのprintfではポインタ用のフォーマットだが同じとは限らん
0033デフォルトの名無しさん
2009/06/30(火) 22:15:41要するに一の補数系か二の補数系かっていう違いじゃないの?
-1してるって事は二の補数系だから一の補数系からの移植って
可能性も高いね
0034デフォルトの名無しさん
2009/06/30(火) 22:16:09整数の定数は、数字から始まるものらしい。
http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide19-1.html
だから、-2147483648 は、-演算子と整数2147483648からなる定数式らしい。
0035デフォルトの名無しさん
2009/06/30(火) 22:20:55おぉ、なった!
char **ppChar[] = { ppChar1, ppChar2, ppChar3, NULL };
これができるのは独自拡張のおかげなんだね。
んー勉強になる。
0036デフォルトの名無しさん
2009/06/30(火) 22:25:01ってことか
0037デフォルトの名無しさん
2009/06/30(火) 22:30:150038デフォルトの名無しさん
2009/06/30(火) 22:35:410039デフォルトの名無しさん
2009/06/30(火) 23:27:47#define LONG_MIN (-2147483647L-1) /* minimum signed long value */
と書いてあった
考えると不思議だな
0040デフォルトの名無しさん
2009/07/01(水) 00:26:06どなたかわかりませんか?
int max_number(int array[])
{
int max;
int c = 0;
max = array[0];
for(c = 0;; ++c){
if(array[c] == '\0')
break;
if(array[c] >= max)
max = array[c];
}
return (max);
}
0041デフォルトの名無しさん
2009/07/01(水) 00:27:22配列の中身の最後が 0 になっていないと思う
0042デフォルトの名無しさん
2009/07/01(水) 00:29:41あっ‥‥!文字列と勘違いしてたってことですかね!?
0043デフォルトの名無しさん
2009/07/01(水) 00:48:24あと'\0'が終わりを意味するのはC言語での文字列のお約束事
0044デフォルトの名無しさん
2009/07/01(水) 00:50:21それは文字の話であって数字として扱う場合は0もありえるのでだめでしょ
0045デフォルトの名無しさん
2009/07/01(水) 01:14:150046デフォルトの名無しさん
2009/07/01(水) 01:25:330047デフォルトの名無しさん
2009/07/01(水) 02:12:58人になにかを教えられると思えるのが2chのいいところだな。
0048デフォルトの名無しさん
2009/07/01(水) 04:58:08#include <stdlib.h>
int main(void)
{
int *p1;
if((p1 = malloc(sizeof(int))) != NULL)
{
*p1=10;
printf("p1の内容は%d",*p1);
}
else
{
printf("メモリを確保できませんでした。");
}
return 0;
}
エラーが出ます。何かおかしいでしょうか。
(7) : error C2440: '=' : 'void *' から 'int *' に変換できません。
0049デフォルトの名無しさん
2009/07/01(水) 05:19:080050デフォルトの名無しさん
2009/07/01(水) 06:50:500051デフォルトの名無しさん
2009/07/01(水) 07:22:21p1 = (int *)malloc
C++ではキャストしないといけない
Cだとしなくてもいい
0052デフォルトの名無しさん
2009/07/01(水) 08:01:49何を言ってるんだ?
0053デフォルトの名無しさん
2009/07/01(水) 09:06:54いずれにしても、(char*)はないな。
Cなら必要ないし、C++ならreinterpret_castを使うべきだ。
0054デフォルトの名無しさん
2009/07/01(水) 09:57:00何故newをつかわないの?
0055デフォルトの名無しさん
2009/07/01(水) 10:00:39C++を使ってCコード書いてもいいじゃん
0056デフォルトの名無しさん
2009/07/01(水) 10:08:23スレチだけどstatic_castじゃないの?
0057デフォルトの名無しさん
2009/07/01(水) 10:31:560058デフォルトの名無しさん
2009/07/01(水) 10:33:15static_castを使ってコンパイル通るかやってみ
0059デフォルトの名無しさん
2009/07/01(水) 10:56:34通らないことってあるの?
0060デフォルトの名無しさん
2009/07/01(水) 10:57:13だから実際にコンパイルしてみろと言っている
0061デフォルトの名無しさん
2009/07/01(水) 11:07:26#include <cstdlib>
int main()
{
char* p = static_cast<char*>(std::malloc(sizeof(char) * 10));
}
普通に通るけど?
0062デフォルトの名無しさん
2009/07/01(水) 11:10:37いま手元にVCしかなくて
帰ったらgccでも試してみるよ
通るのが普通だと思ってた
0063デフォルトの名無しさん
2009/07/01(水) 11:14:12関数ポインタとかだったらreinterpret_castじゃないとエラー出そうだけど
0064デフォルトの名無しさん
2009/07/01(水) 11:16:01% cat > a.cpp
#include <iostream>
#include <cstdlib>
int main()
{
char* p = static_cast<char*>(std::malloc(sizeof(char) * 10));
}
% g++ -Wall a.cpp
a.cpp: In function `int main()':
a.cpp:6: 警告: unused variable 'p'
0065デフォルトの名無しさん
2009/07/01(水) 11:38:16static_castを使ってコンパイル通るかやってみ
0066デフォルトの名無しさん
2009/07/01(水) 12:26:42ひょっとしてCだとstatic_castは通らないと言いたいのかも?
0067デフォルトの名無しさん
2009/07/01(水) 12:43:18static_castは危険だからなるべく使うなってことらしい
出来るだけstatic_castを使うようにしてた orz
スレチすまんかった
0068デフォルトの名無しさん
2009/07/01(水) 13:12:55ありがとうございました。
ほかの方も勉強になります。
0069デフォルトの名無しさん
2009/07/01(水) 16:07:28どうしても丸が右上4分の1の扇形になってしまいます。
ここが違うのだと思うのですがぱっと見違うところはありますでしょうか。
ここだけ見せられても困るかもしれないですが…。
void circle(int x0,int y0,int r0,int r,int g,int b)
{
int i,j;
for(i=y0;i<=MS-1;i++)
{
for(j=x0;j<=MS-1;j++)
{
if(((j-x0)*(j-x0))+((i-y0)*(i-y0))<=r0*r0)
{
bmp[i][j][0]=b;
bmp[i][j][1]=g;
bmp[i][j][2]=r;
}
}
}
}
0070デフォルトの名無しさん
2009/07/01(水) 16:11:120071デフォルトの名無しさん
2009/07/01(水) 16:24:21なんでループ変数にi,jを使って解り難くするのか、は置いといても
>if(((j-x0)*(j-x0))+((i-y0)*(i-y0))<=r0*r0)
こんなことするから何処が原点だか解らなくなるんだろ。
0073デフォルトの名無しさん
2009/07/01(水) 16:37:40円内かどうかの判定部分に関して:
i, j の範囲が 円中心に対して正のほうしか振っていないから当然 1/4の扇にしかならない
代入用の範囲 と 円判定の範囲(+渡された半径との関係) とをどうしたいのか整理せよ
0074デフォルトの名無しさん
2009/07/01(水) 16:43:23B) 中心 x0, y0 半径 r を囲む矩形 (x0-r..x0+r, y0-r..y0+r)
この2つの矩形の重なっている部分に対して 円内判定すればよい
0075デフォルトの名無しさん
2009/07/01(水) 16:49:35扇しかかけてないってことは誰かが言ってるように原点を中心にX,Yを正にしかみてない
X・・・正
Y・・・正
X・・・正
Y・・・負
X・・・負
Y・・・正
X・・・負
Y・・・負
この4つを組み合わせて初めて円になる
0076デフォルトの名無しさん
2009/07/01(水) 16:53:47適当に答える
for(i=1-MS;i<=MS-1;i++)
{
for(j=1-MS;j<=MS-1;j++)
にすればいいんじゃない
0077デフォルトの名無しさん
2009/07/01(水) 17:00:07全表示空間を総なめして 円内かどうかの判定してるなら
中心基準での座標系は x' = i-x0, y' = j-y0 になって、結果その記述であってるが…
bmp[][] の周辺から実際に可視化する作業の過程で間違ってないか?
0078デフォルトの名無しさん
2009/07/01(水) 17:02:28int hi = min(x0 + r0, MS -1);
for (i = lo; i <= hi; ++i)
0079デフォルトの名無しさん
2009/07/01(水) 17:04:25なぜなのか謎だったのでわかってよかったです。
ありがとうございました。
>>76
やってみたらできました。ありがとうございます!
0080デフォルトの名無しさん
2009/07/01(水) 17:13:38それはそれで 頭の中が整理できていないから 後々変なことを引き起こすかもよ。
x0, y0, r と 内部のループの i,j の関係は?
修正後のコードだと i,j は円を中心にした座標を意味したことになるので、ぶっちゃけx0,y0 の存在が無駄になる
i,j と bmp[][] の関係は?
今の修正後のコードだと 負の値渡るけど?
0081デフォルトの名無しさん
2009/07/01(水) 18:26:59通ったよ
0082デフォルトの名無しさん
2009/07/01(水) 18:28:27reinterpret_castよりもstatic_castの方が危険ってなんでなんだろうね
008382
2009/07/01(水) 18:32:59暗黙の型変換が行えない場合でも半ば強制的にキャストを行う場合にreinterpret_castだと思ってた俺バカス
さ、、あちこち書き直すかorz
0084デフォルトの名無しさん
2009/07/01(水) 18:41:34static_castで変な型変換されたらマズイじゃないか
0085デフォルトの名無しさん
2009/07/01(水) 18:45:03動作としては単方向リストで、
list->name
list->adr
list->age
をキーボードからscanfで入力し、最後を
list->next = (str) calloc(1, sizeof(str))
として、先頭アドレスを返す。
続けて入力するのであれば、list=list->nextをした上で最初から繰り返すといった具合です。
プログラム自体は完成していて、ageまでは入力できました。
しかし、callocを行うと既に入力されている変数がバグってしまいます。
例:calloc直前までnameには「ABC DEF」と入っていたが、calloc直後にprintfすると、中身はゴミになっている。
デバッガーで見てみても、callocを境に正常に入力された値が"Old Value"扱いとなっており、
"New Value"に意味不明な文字列が代入されているのが見れました。
list->next = (str) calloc(1, sizeof(str))
をしただけなら直接的に弄ったのはlist構造体のnextだけで、nameやadrは弄っていないと思っていたのですが、
違うのでしょうか?
これを回避するにはどうしたらよいのでしょうか?
本当に、この一文を前後に入力した値がぶっ壊れていて、どうして?といった疑問で一杯です・・・。
宜しくお願いします。
0086デフォルトの名無しさん
2009/07/01(水) 18:50:170087デフォルトの名無しさん
2009/07/01(水) 18:54:11sizeof(str) は 結局 sizeof(void *) と同じ意で ポインタを保持するための大きさ でしかなく
構造体の本体の器のサイズを得るのは sizeof(構造体名) とでもしないとまずいのでは?
0088デフォルトの名無しさん
2009/07/01(水) 18:55:11あやしい。
(str *) calloc(1, sizeof(str)) じゃないとすると、 typdef struct foo *str; されている可能性が高い。
0089デフォルトの名無しさん
2009/07/01(水) 19:09:25○ list->next = (str) calloc(1, sizeof(*list->next))
ポインタと実体の違いがわかっていない状態で calloc, malloc 使用した線形リストはヤバイね
0090デフォルトの名無しさん
2009/07/01(水) 19:15:59をした上で名称でした。
link->next=(struct str*) calloc(1,sizeof(struct str*));
となっていると思います。
ヘッダファイルを分けていたため、typedefしたことを忘れていました・・・申し訳ありません。
0091デフォルトの名無しさん
2009/07/01(水) 19:18:19とかわかりやしのにしろ
0092デフォルトの名無しさん
2009/07/01(水) 19:20:41どのようにわかりやすいのか、理解できない
0093デフォルトの名無しさん
2009/07/01(水) 19:21:42こうだ
元のままだと構造体をさすポインタを確保しててそもそもやろうとしてることになってない
0094デフォルトの名無しさん
2009/07/01(水) 19:22:26元と同じ名前にするなってことだろ
元を連想しやすい別名にしろと
0095デフォルトの名無しさん
2009/07/01(水) 19:39:08static_castはビットを型にあわせて書き換えるのだ。
だから、void*の機能を考えるとreinterpret_castの方が自然なのだ。
0096デフォルトの名無しさん
2009/07/01(水) 19:43:05static_castは環境やコンパイラによって異なる可能性のあるビット列を
ちゃんと環境に合うように変換する。何も「仮定」しない。
コンパイラが決められたルールを守ってビット列を変換する。
void*を経由した型変換でもやっぱりstatic_castを使うべきだと思っちゃうのだ。
0097デフォルトの名無しさん
2009/07/01(水) 19:44:540098デフォルトの名無しさん
2009/07/01(水) 19:46:23経由じゃなくて元からvoid *の場合は?例えばmallocの戻り値。
0099デフォルトの名無しさん
2009/07/01(水) 21:39:00フリーソフトなどを公開しているHPで、WindowsXP Visual Studio2005でコンパイル Windows2000 Visual Stdio2005でコンパイルと書いた
ものが存在したのですが、同じVisual Studio2005でもOSが違えばコンパイル後の実行バイナリは違った物が作成されるのでしょうか?
また、もし違ったものが作成されるのであれば、Windows2000,XP,Vistaなどで使う場合使うOSを同じ環境でコンパイルされた物の方が良いのでしょうか?
0100デフォルトの名無しさん
2009/07/01(水) 22:25:46で、質問の答えだけど、コンパイルした環境以外で動くことは保証されない。
ただし、Windowsや一般のOSの場合、後方互換性を持つ場合が多いので
一番古いOS(Win2K)でコンパイルすれば、それ以降のOSで動くことは多い。
0101デフォルトの名無しさん
2009/07/01(水) 22:26:05void*と他のポインタ型は相互変換が規格で保障されているので、
規格に合致したC++コンパイラなら、どちらを使っても結果は必ずいっしょ。
一緒でないとウンコ。そして、それでもやはりstatic_cast。
0102デフォルトの名無しさん
2009/07/01(水) 22:33:08これはひどい
0103デフォルトの名無しさん
2009/07/01(水) 22:37:50レジスタ変数とかを用いて処理速度を比べたりしたけど、あんまり違いが出なかったorz
0104デフォルトの名無しさん
2009/07/01(水) 22:39:402000とXPではモジュールの検索順が違うので、システムにあるものとローカルにあるCRTのバージョンが違ったりすると、リンカが違うバイナリを作成する。
それでも別に問題なく動作はするがな。
0105デフォルトの名無しさん
2009/07/01(水) 22:40:08PC向けだとそこまで気を使う必要はないと思うけど・・・
0106デフォルトの名無しさん
2009/07/01(水) 23:09:05ありがとうございます。
皆さんに色々と情報を頂けたので少し自分で調べてみたいと思います。
また、からないことが出てくるとは思いますが、そのときはよろしくお願いします。
0107デフォルトの名無しさん
2009/07/02(木) 02:45:52レジスタ割り当ての最適化なんてのはコンパイラ設計の初歩中の初歩なので、
コンパイラは人間が指定したレジスタ割り当てなんて採用しません。
0108デフォルトの名無しさん
2009/07/02(木) 08:02:29ループの最適化やレジスタ周りは覚えておいて損はない
0109デフォルトの名無しさん
2009/07/02(木) 11:55:39double power(double dx, int no)
{
double tmp = 1.0;
while (no-- > 0)
tmp *= dx;
return(tmp);
}
int main(void)
{
int n;
double x;
printf("実数を入力してください:"); scanf("%1f", &x);
printf("整数を入力してください:"); scanf("%d", &n);
printf("%.2fの%d乗は%.2fです。\n", x, n, power(x, n));
return(0);
}
これを実行しても0.00の4096乗は0.00とかなるんだが
どこが間違ってるのか全く分かんない。
関数難しいよ
0110デフォルトの名無しさん
2009/07/02(木) 12:01:340111デフォルトの名無しさん
2009/07/02(木) 12:15:341とl(エルの小文字)を見間違えたんだね
0112デフォルトの名無しさん
2009/07/02(木) 12:15:41○%lf
だな
0113デフォルトの名無しさん
2009/07/02(木) 12:32:33しかしなんて恥ずかしいミスだw
0114デフォルトの名無しさん
2009/07/02(木) 20:59:350115デフォルトの名無しさん
2009/07/02(木) 21:01:332chでのミスって、
実生活には何の影響もないから
実質的には恥じゃないよな。
逆に言えば空気読まないこと言って
たたかれたとしても
別に忘れ去ってしまえるわけで、
それが2chのいいところであり悪いところ。
・・・っとどうでもいい話を書いてしまった。
0116デフォルトの名無しさん
2009/07/02(木) 21:03:150117デフォルトの名無しさん
2009/07/02(木) 22:48:24そのコンテナの中身を全削除したいときってどうすればよいのでしょうか?
clear()がないらしいですが、代わりの方法ってあるのでしょうか?
ループでpop()をするのは効率が悪いように思うのですが、clear()が用意されていない理由がわかりません。
0118デフォルトの名無しさん
2009/07/02(木) 22:57:140119デフォルトの名無しさん
2009/07/02(木) 23:15:14STLって何ですか?
C言語にそんなのないんですけど。
goto
ttp://pc12.2ch.net/test/read.cgi/tech/1244942050/
0120デフォルトの名無しさん
2009/07/03(金) 20:48:09__*_*__
___*___
と数字を入力すると表示されるプログラムをfor文で作りたいのですが、
左右の三角形で分けて表示するプログラムはどのようにすればいいのでしょうか?
"_"の部分は空白で表示したいと思っています。上の図は数字を3と入力した時の例です。
0121デフォルトの名無しさん
2009/07/03(金) 21:02:39scanf("%d", &n);
for(i=0; i<n; i++) {
for(j=0; j<i; j++) putchar(' ');
for(j=n; j>i; j--) printf(" *");
putchar('\n');
}
0122デフォルトの名無しさん
2009/07/03(金) 21:18:160123デフォルトの名無しさん
2009/07/03(金) 21:31:19_*_* _*_
__*_ *__
___* ___
にしたかったのですが、そのまま
_*_*_*_
__*_*__
___*___
と表示されるように組むほうが楽のようですね。
>>121を入れてみたらずっと*が流れてしまいます・・・。
0124デフォルトの名無しさん
2009/07/03(金) 21:41:16_*_*_*_*_*_
__*_*_*_*__
___*_*_*___
____*_*____
_____*_____
中を空白にしたいとか言われるとめんどくさい
_*_*_*_*_*_
__*_____*__
___*___*___
____*_*____
_____*_____
0125デフォルトの名無しさん
2009/07/03(金) 21:42:26はい。上の図の形を作りたいのです。
0126デフォルトの名無しさん
2009/07/03(金) 21:52:29左空白: 空白が1個ずつ増えていく
中の星: ”*_”の2文字の繰り返し。その2文字の表示回数が減っていく
右空白: 基本的に左と同じ、ただし空白が1個少ない
0127デフォルトの名無しさん
2009/07/03(金) 22:16:07for(j = 0; j < n * 2; ++j)
putchar((i+j)%2 ? i <= j ? n * 2 - i >= j ? '*' : ' ' : ' ' : ' ');
putchar('\n');
}
0128デフォルトの名無しさん
2009/07/03(金) 23:07:170129デフォルトの名無しさん
2009/07/03(金) 23:20:450130デフォルトの名無しさん
2009/07/03(金) 23:26:060131デフォルトの名無しさん
2009/07/03(金) 23:30:21#define putchar(c) putc(c, stdout)
0132デフォルトの名無しさん
2009/07/03(金) 23:40:060133デフォルトの名無しさん
2009/07/03(金) 23:41:560134デフォルトの名無しさん
2009/07/04(土) 10:43:17putcも普通はマクロ。
明示的に関数を使いたかったら、fputc(c, stdout) とする
0135デフォルトの名無しさん
2009/07/04(土) 11:01:310136デフォルトの名無しさん
2009/07/04(土) 11:19:520137デフォルトの名無しさん
2009/07/04(土) 11:20:580138デフォルトの名無しさん
2009/07/04(土) 11:24:520139デフォルトの名無しさん
2009/07/04(土) 11:37:300140デフォルトの名無しさん
2009/07/04(土) 11:43:460141デフォルトの名無しさん
2009/07/04(土) 21:23:01そんなこといってるとバカが巣くってくるぞ
0142デフォルトの名無しさん
2009/07/04(土) 22:55:15初心者には分りにくいんじゃないか?
0143デフォルトの名無しさん
2009/07/04(土) 23:46:04111,222,333
のような、カンマ区切りの1000万行のcsvデータを読み込み、
配列に格納するのに、最も早い方法を教えてください。
私は
while ((fgets(buff,100,fp)) != NULL){
sscanf_s(buff,"%d,%d,%d",&x,&y,&z);
xx[i]=x;
yy[i]=y;
zz[i]=z;
i++;
}
としています。
宜しくお願いします。
0144デフォルトの名無しさん
2009/07/05(日) 01:16:42sscanf(buff, "%d,%d,%d", &xx[i], &yy[i], &zz[i]);
0145デフォルトの名無しさん
2009/07/05(日) 01:39:17桁数が3桁ずつ固定なら、whileの中身を
xx[i] = atoi(buff);
yy[i] = atoi(buff+4);
zz[i] = atoi(buff+8);
++i;
とでもした方が速い
>>143本気で質問してるなら環境とか入力フォーマットもっと詳しく書け
0146デフォルトの名無しさん
2009/07/05(日) 06:32:03すいません、本気です。大学でサンプリング512Hz、24時間、7項目、
合計22,118,400行のデータを測定しています。
使用環境はvc2008 MFCpro SDI です。データは6桁で最初1項目が整数、
残り5項目が実数で、カンマ区切りのcsvファイルです。
整数,実数,実数,実数,実数,実数,実数
このうち使用したいのが、1項目と、4,5,6項目目です。
データは4パケットひとかたまりです。
0,0,0,0,0,0,0
0,1,1,0,0,0,1
0,2,2,0,0,0,2
0,3,3,0,0,0,3
1,4,4,1,1,1,4
1,5,5,1,1,1,5
1,6,6,1,1,1,6
1,7,7,1,1,1,7
2,8,8,2,2,2,8
2,9,9,2,2,2,9
2,10,10,2,2,2,10
2,11,11,2,2,2,11
試したのは、行数を取得してから配列に格納する方法です。アドバイス宜しくお願いします。
0147デフォルトの名無しさん
2009/07/05(日) 06:33:56int pake0,pake2,i=0,lineCount=0;
float x,y,z,*xp,*yp,*zp;
char buff[100],filename[9]="test.csv";
if ((fp = fopen(filename,"r")) == NULL){return;}
while ((fgets(buff,100,fp)) != NULL){ //行数のカウント
sscanf_s (buff,"%d,%*f,%*f,%*f,%*f,%*f,%*f,",pake1);
if(pake1 != pake0){
pake0 = pake1;
lineCount++;}
fclose(fp);
px = (float *)malloc(sizeof(float) * lineCount); //メモリ確保
py = (float *)malloc(sizeof(float) * lineCount);
pz = (float *)malloc(sizeof(float) * lineCount);
if ((fp = fopen(filename,"r")) == NULL){return;}
while ((fgets(buff,100,fp)) != NULL){ //ファイルの読み込み
sscanf_s (buff,"%d,%*f,%*f,%f,%f,%f,%*f",pake1,&x,&y,&z);
if(pake1 != pake0){
pake0 = pake1;
px[i] = x;
py[i] = y;
pz[i] = z;
i++; }}
fclose(fp);
0148デフォルトの名無しさん
2009/07/05(日) 09:54:120149デフォルトの名無しさん
2009/07/05(日) 10:04:37テキストファイルを読む以上、多少のオーバーヘッドは仕方ない。
scanfにしても自分で文字列操作するよりは、たいてい速い。
やるなら >>144 ぐらい。
そのソースなら、まずは2回読まないようにするのがいい
最大サイズが予想できるなら lineCount を定数にしてもいいし、
溢れそうなときに reallocで倍々に増やす方法もある。
0150デフォルトの名無しさん
2009/07/05(日) 10:11:490151デフォルトの名無しさん
2009/07/05(日) 10:26:08どっかのタイミングで必要なデータだけテキスト解析の必要ないバイナリにでも変換しておくのがいいんじゃないか
0152デフォルトの名無しさん
2009/07/05(日) 10:28:06はじめからバイナリ(配列格納形式)にして一度に読めよ・
0153デフォルトの名無しさん
2009/07/05(日) 10:36:17今でも有効かどうかは知らんけど。
0154デフォルトの名無しさん
2009/07/05(日) 11:52:01読み込み部分をいくら弄っても、ファイルIOがボトルネックになっててあまり変わらないんじゃないかな。
SSDやRAMディスクなど、速いディスクに置くのが手っ取り早いとおもう。
あとはデータを複数台に分散させて処理とかかな。
0155デフォルトの名無しさん
2009/07/05(日) 17:16:150156デフォルトの名無しさん
2009/07/05(日) 17:31:43どうしたらいいですか?
0157デフォルトの名無しさん
2009/07/05(日) 17:41:32文字列の最後に何か入ってますよね?
あれってどうやったら認識しないように出来ますか?
if(string[n]!=0){
みたいにして、文字ごとに操作をしているのですが、最後の文字を認識してしまうのです。
0158デフォルトの名無しさん
2009/07/05(日) 17:44:09それならそのコードでも別にいいようにおもうよ。
とは別に何か入ってるというのなら、改行コードがCRLFなんかね。
0159デフォルトの名無しさん
2009/07/05(日) 17:47:230160デフォルトの名無しさん
2009/07/05(日) 17:48:58ありがとうございます。
やはり改行コードに問題があるんですね。
CRLFとはどういうことでしょうか?
ちょっとぐぐってみたところ、改行末だけじゃなく、
改行した後の頭にも何か文字が入っている方式、みたいな感じでしょうか?
0161デフォルトの名無しさん
2009/07/05(日) 17:50:49CRLFっていうのは改行コードが二文字で出来てる奴のことを言うのですね。
ありがとうございました。
0162デフォルトの名無しさん
2009/07/05(日) 17:52:37WindowsだとCR+LF
UNIX、LinuxなんかLF
macだとCR
というかんじ。
C言語だとCRが\rで表せて、LFが\nで表せるので、\nだけしか気にしていないと、\rが残るというお話。
0163デフォルトの名無しさん
2009/07/05(日) 17:53:18おつおめ
0164デフォルトの名無しさん
2009/07/05(日) 17:54:21うちはWindowsなので納得です。
0165デフォルトの名無しさん
2009/07/05(日) 17:59:51テキストモードで呼び出すなら\nに変換されるから問題ナッシングのはずよ。
0166デフォルトの名無しさん
2009/07/05(日) 18:05:120167デフォルトの名無しさん
2009/07/05(日) 18:06:530168デフォルトの名無しさん
2009/07/05(日) 18:07:37来世になったら
0169デフォルトの名無しさん
2009/07/05(日) 18:08:160170デフォルトの名無しさん
2009/07/05(日) 18:18:11そういうときはバイナリモードで読み込んで自前で処理するしかないわね。
C言語の場合、テキストモードとバイナリモードの違いは
単に'\n'を環境向けに書き換えるか書き換えないかだけだから。
0171デフォルトの名無しさん
2009/07/05(日) 19:18:59文字コードのEOFの扱いとかちょこちょこと違った気がする。
どうだっけ?
0172デフォルトの名無しさん
2009/07/05(日) 22:50:38// 2007/3/15
// Lesson1: マップの作成と描画、キー入力とキャラの移動
// Movie: http://fatalita.sakura.ne.jp/TubeRPG/
// HP: http://fatalita.sakura.ne.jp/
//
#include <stdio.h>
#include <stdlib.h>
#define KEY_UP 'u'
#define KEY_DOWN 'd'
#define KEY_RIGHT 'r'
#define KEY_LEFT 'l'
#define MAP_SIZE_Y 10
#define MAP_SIZE_X 10
int x = 3, y = 4;
int map[100][100] = {
{1,1,1,1,1,1,1},
{1,0,0,3,0,0,1},
{1,0,0,0,0,0,1},
{1,0,2,0,2,0,1},
{1,0,0,0,0,0,1},
{1,1,1,1,1,1,1},
} ;
0173デフォルトの名無しさん
2009/07/05(日) 22:55:44int i,j;
for ( j = 0; j < MAP_SIZE_Y; j++ )
{
for ( i = 0; i < MAP_SIZE_X; i++ )
{
if ( j == y && i == x ){
printf("勇");
} else {
switch ( map[j][i] ){
default:printf(" "); break;
case 1: printf("■"); break;
case 2: printf("兵"); break;
case 3: printf("王"); break;
}
}
}
printf("\n");
}
}
0174デフォルトの名無しさん
2009/07/05(日) 22:58:57長いソースならテキストでどこかにそのまま上げて
リンク貼った方がいいよ
0175デフォルトの名無しさん
2009/07/05(日) 22:59:30void GetKey(){
switch ( getchar() ){
case KEY_UP: y--; break; //UP
case KEY_DOWN: y++; break; //DOWN
case KEY_LEFT: x--; break; //LEFT
case KEY_RIGHT: x++; break; //RIGHT
}
}
int main(void){
while (1)
{
system("clear");
puts("上:u, 右:r, 下:d, 左:l");
DrawMap();
GetKey();
}
return 0;
}
連発すまそ
このRPGで階段にのぼったりする判定を作りたいんだけど。
なかなかうまくいかない。
どうすればいいかな?
map[3][2]==jとかやっても無理っぽいんだが。
壁にぶつかったときそれ以上すすませないとか。
0176デフォルトの名無しさん
2009/07/05(日) 23:11:30ゲームプログラマになる前に云々っていう本でもろ同じような題材扱ってたから、
それ読んだ方がいいと思うよ。
0177174
2009/07/05(日) 23:13:49元のテキストであげてくれ
インデント直したりとメンドクサイw
0178デフォルトの名無しさん
2009/07/05(日) 23:20:40>>177
あーそっちのほうがよかった
http://wavelet.blog58.fc2.com/blog-entry-205.html
ブログを見つけたのでこれです
下にあるソースコードがマップ表示のやつです。
こういう感じのがいいんですよね 壁とかぶつかっても通りすがりますがw
0179デフォルトの名無しさん
2009/07/05(日) 23:22:30void f(double x,double y,double z);
double x,y,z;
int main(void){
y=2.0;
z=4.0;
f(x,y,z);
printf("%f",x);
return 0;
}
void f(double x,double y,double z){
x=y*z;
}
例えば↑のように
main内で計算だけ(戻り値なしの)関数を呼び出して行いたいですけど
↑の記述だと0.000000となってしまいます
どこがおかしいんでしょうか?
0180デフォルトの名無しさん
2009/07/05(日) 23:23:43それだとxの中は書き換わらない
0181デフォルトの名無しさん
2009/07/05(日) 23:24:06正常な動作です
0182デフォルトの名無しさん
2009/07/05(日) 23:26:03たとえば
f(x,y,z);
↓
x = f(y,z);
void f(double x,double y,double z){
x=y*z;
}
↓
double f(double y,double z){
return y*z;
}
とか
f(x,y,z);
↓
f(&x,y,z);
void f(double x,double y,double z){
x=y*z;
}
↓
void f(double* x,double y,double z){
*x = y * z;
}
0183デフォルトの名無しさん
2009/07/05(日) 23:28:02だからあげろって
0184デフォルトの名無しさん
2009/07/05(日) 23:30:56ttp://www.break.com/usercontent/2008/1/Making-TubeRPG-by-C-Language-in-10-minutes-426231.html
0185デフォルトの名無しさん
2009/07/05(日) 23:33:49GetKeyの中で勇者をとっとと移動してるけど、そこで壁かどうか判定すればいいよ
GetKeyの中でやるもんでも無いように思うけど。
0186デフォルトの名無しさん
2009/07/05(日) 23:34:010187デフォルトの名無しさん
2009/07/05(日) 23:34:40つまり、名前の隠蔽だよ。
同じ名前を使うと、内側のスコープの名前によって
外側のスコープの名前は隠蔽される。
int x = 4;
{
int x = 2;
}
これが許されるのは内と外のxが別の変数とみなされるから。
0188デフォルトの名無しさん
2009/07/05(日) 23:54:480189デフォルトの名無しさん
2009/07/06(月) 00:06:54懐かしいな
おじさんが昔4行程度しかないポケコンで作ってたRPGのままだわ
0190デフォルトの名無しさん
2009/07/06(月) 00:14:530191デフォルトの名無しさん
2009/07/06(月) 00:18:09もっぱらベーマガのリストを打ってただけだけど
0192デフォルトの名無しさん
2009/07/06(月) 00:20:49ポケモンコンピューターの略だよ
0193デフォルトの名無しさん
2009/07/06(月) 00:21:50つまりポリゴンみたいな?
0194デフォルトの名無しさん
2009/07/06(月) 00:23:17からかわれてるんだよ
0195デフォルトの名無しさん
2009/07/06(月) 00:25:400196デフォルトの名無しさん
2009/07/06(月) 00:26:05ありがとうございます
0197デフォルトの名無しさん
2009/07/06(月) 00:26:320198デフォルトの名無しさん
2009/07/06(月) 00:36:120199デフォルトの名無しさん
2009/07/06(月) 00:37:280200デフォルトの名無しさん
2009/07/06(月) 00:39:36スタティックリンクなら組み込まれる
ダイナミックリンクなら組み込まれない
0201デフォルトの名無しさん
2009/07/06(月) 00:45:38スタティックリンクであった場合、バイナリを解析することでprintf関数が組み込まれている
ということを知ることはできますか?
0202デフォルトの名無しさん
2009/07/06(月) 00:46:22そりゃあるでしょ
0203デフォルトの名無しさん
2009/07/06(月) 00:47:17それを実行コードから判別されないか知りたいのね?
それなら判別できるし、訴訟を起こされるよ。
どっかのシューティングゲームみたいに。
0204デフォルトの名無しさん
2009/07/06(月) 00:49:32オプソのコードつかって
0205デフォルトの名無しさん
2009/07/06(月) 00:51:19プログラミング言語Cの演習1-12がよくわからないので質問させてください
ab cd efのように入力した単語をスペースやタブなら改行して
ab
cd
ef
と出力させたいのですがうまくいきません。
0206デフォルトの名無しさん
2009/07/06(月) 00:52:40#include <stdio.h>
int main(void)
{
int c;
while((c = getchar()) != EOF){
if((c != ' ') || (c != '\t' ))
putchar(c);
else
putchar('\n');
}
return 0;
}
です。
これを実行すると
ab cd ef
ab cd ef
のようになってしまいます
どこが駄目なんでしょうか?
0207デフォルトの名無しさん
2009/07/06(月) 00:54:23http://e-words.jp/p/r-ascii.html
スペースは0x20、TABは0x09でチェックすればOK
0208デフォルトの名無しさん
2009/07/06(月) 00:56:330209デフォルトの名無しさん
2009/07/06(月) 01:06:00ありがとうございます。
なぜ' 'では駄目なのでしょうか?
>>208
ありがとうございます!
完璧にうごきました
ですが、なぜボクのコードではうまくいかないのかわかりません
よろしければおしえてください
論理演算子の使い方が間違えているのでしょうか?
0210デフォルトの名無しさん
2009/07/06(月) 01:09:42こんがらがってきた
0211デフォルトの名無しさん
2009/07/06(月) 01:11:18あー>>207は先読みしすぎた回答です。
>>207のような文字コードで指定してもいいし>>206のような方法でもいいです。
ド・モルガンの定理になるのかな?
0212デフォルトの名無しさん
2009/07/06(月) 01:12:39をへんかんすると
if(!((c == ' ') && (c == '\t' )))
となります
CがスペースとTABに同時になることはありませんよね?
0213デフォルトの名無しさん
2009/07/06(月) 01:14:25ありがとうございます。
理解できました。
これはプログラミング以前の問題でしたね
すいません
0214デフォルトの名無しさん
2009/07/06(月) 01:16:30よく理解できました
本当にありがとうございます
0215デフォルトの名無しさん
2009/07/06(月) 01:19:130216デフォルトの名無しさん
2009/07/06(月) 08:24:06よろしければお教えください
0217デフォルトの名無しさん
2009/07/06(月) 08:49:57http://k2top.jpn.org/index.php?K2Editor
0218デフォルトの名無しさん
2009/07/06(月) 09:05:470219デフォルトの名無しさん
2009/07/06(月) 09:23:080220デフォルトの名無しさん
2009/07/06(月) 09:44:08ありがとうございます
>>217
コンパイラはbolandなのですが
このエディタから直接呼び出したり出来るでしょうか?
0221デフォルトの名無しさん
2009/07/06(月) 10:21:20どのようにすればいいのでしょうか?
1.コマンドプロンプトを表示する
2.キーボードからコマンドを文字列として入力する
3.入力した文字列を調べる
4.forkして子プロセスを作る
5.子プロセスで、3. で調べたコマンドを exec する
6.親プロセスは子プロセスの終了を待って、1. に戻る
使用環境はVineLinux4.2です。
0222デフォルトの名無しさん
2009/07/06(月) 10:40:31その手順通りにすればいいのでは?
見たところ、抜けてるような手順はないし。
0223デフォルトの名無しさん
2009/07/06(月) 11:08:05ありがとうございます。
execやforkの使い方が全く分からないのですが
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char comm[64];
//execvpを使ってGNOME端末を起動する
execvp("gnome-terminal");
//commandを入力する
printf("command> ");
scanf("%s", comm);
こうやって書いていってちゃんとexec出来ているのでしょうか?
0224デフォルトの名無しさん
2009/07/06(月) 11:14:280225デフォルトの名無しさん
2009/07/06(月) 11:15:070226デフォルトの名無しさん
2009/07/06(月) 11:46:33その意味というか動作を理解するのが大変だったよ
プロセスが複製されるって何?!
しかも親と子が同じ位置から動作を続けるって何?!
みたいな
0227デフォルトの名無しさん
2009/07/06(月) 11:50:450228デフォルトの名無しさん
2009/07/06(月) 12:47:09値が入力されたときに、その都度変数が作られるという処理は効率がよくないのでしょうか?
0229デフォルトの名無しさん
2009/07/06(月) 12:57:50単純だけど気持ち悪いんだよねw
0230デフォルトの名無しさん
2009/07/06(月) 13:13:03ありがとうございます。とりあえず手順通りにやってみます。
0231デフォルトの名無しさん
2009/07/06(月) 13:59:46一般論としては
あらかじめ配列確保⇒ ×メモリ効率 ○実行効率
そのつど配列を確保⇒ ○メモリ効率 ×実行効率
じゃね。まあ好きなようにすればいい
0232デフォルトの名無しさん
2009/07/06(月) 14:00:200233デフォルトの名無しさん
2009/07/06(月) 14:12:040234デフォルトの名無しさん
2009/07/06(月) 15:39:09fopenしたファイルを操作している傍らで低レベル入出力を操作するのは
どうにも美しくないと思うんだけど、どうなの?
あとロックファイルが別に必要というのも美しくない。
fopenに歯痛ロックと共有ロックのオプションがあっても良かったと思うんだけど。
0235デフォルトの名無しさん
2009/07/06(月) 16:25:25MSのVCには _fsopen() なんてのがあるらしいな
0236デフォルトの名無しさん
2009/07/06(月) 16:38:28どんな環境を想定して言っているのか知らぬけど
> ファイルロックをするとき、flockを使うのが一般的だと思うけど
入門書のレベルではね
> fopenしたファイルを操作している傍らで低レベル入出力を操作するのは
> どうにも美しくないと思うんだけど、どうなの?
> あとロックファイルが別に必要というのも美しくない。
> fopenに歯痛ロックと共有ロックのオプションがあっても良かったと思うんだけど。
Cで書かれた実用的なプログラムに美しさを求めてはいけない
美しいコードが必要ならスクリプト言語でも使ってろ
因みにオナニーするときは部屋のロックを掛けとけよ
0237デフォルトの名無しさん
2009/07/06(月) 16:42:46排他ロック付きfopen()があれば便利じゃん
0238デフォルトの名無しさん
2009/07/06(月) 16:43:00for(i=1;i<1001;i+=2
for(j=1;j<(i/2);i+=2){
if(!(i%j)) break;
.
.
.
まさか i%1 が0なんて聞いてないんですが…
どうすればこういう類のもの覚えられるんですか?
0239デフォルトの名無しさん
2009/07/06(月) 16:45:09整数(正)を1で割ったあまりは常に0だろ
0240デフォルトの名無しさん
2009/07/06(月) 16:46:54あっ小学校から出直してきます!!
0241デフォルトの名無しさん
2009/07/06(月) 16:51:400242デフォルトの名無しさん
2009/07/06(月) 17:01:320243デフォルトの名無しさん
2009/07/06(月) 23:12:50#include<stdio.h>
#include<stdlib.h>
main()
{
int nedan[17] ; /*nedan配列は0から16まで*/
int i ;
for (i=0; i<17; i++)
{
printf("配列%d番目 %dの値を入力 \n",i,nedan[i]);
scanf("%d",&nedan[i]);
printf("配列%d番目の値は%dです \n",i,nedan[i]);
}
}
0244デフォルトの名無しさん
2009/07/06(月) 23:17:03初期化していない局所変数に何かを期待しているのか?
0245デフォルトの名無しさん
2009/07/06(月) 23:19:140246デフォルトの名無しさん
2009/07/06(月) 23:29:42初期化してないとこういう値が入ってるんですね。
そういえばそんな感じのことを聞いた覚えがあります。
>>245
参考にしていた書籍にはatoiを使って整数を取得する方法があったので、その名残です。
配列の要素に値を代入する方法を調べていたらscanfを見つけたのでそっちにしました。
回答どうもありがとうございました。
0247デフォルトの名無しさん
2009/07/06(月) 23:33:29初期化してないと値は不定
今回のはたまたまであって今度実行したらまた変わる可能性は十分ある
0248デフォルトの名無しさん
2009/07/06(月) 23:37:48>初期化してないとこういう値が入ってるんですね。
いや、正確に言えば入ってすらいない。
未定義の動作になる。
未定義の動作とは・・・めんどくさいから誰か教えてあげて。
0249248
2009/07/06(月) 23:39:04初級C言語Q&A(7)
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
これぐらいは読んで理解してくださいな。
0250デフォルトの名無しさん
2009/07/07(火) 00:55:300251デフォルトの名無しさん
2009/07/07(火) 01:15:320252デフォルトの名無しさん
2009/07/07(火) 01:17:21煮沸消毒をする鍋を煮沸消毒せねば・・・
ところで無限ループって怖くね?
0253デフォルトの名無しさん
2009/07/07(火) 01:18:120254デフォルトの名無しさん
2009/07/07(火) 01:23:44鍋も一緒に煮沸消毒されね?
マルチスレッドじゃね?
0255デフォルトの名無しさん
2009/07/07(火) 01:25:070256デフォルトの名無しさん
2009/07/07(火) 01:33:09freeの引数はvoid*型ですが、
じゃあだれがmalloc(calloc,realloc)した領域のサイズを管理しているのでしょうか。
くやしいです。
0257デフォルトの名無しさん
2009/07/07(火) 01:36:11環境によるんじゃない?
malloc/freeともに中は環境に合わせて書き直されてるはずだし
とある環境のAPIが優秀なら単なるラッパーになってるだけかもしれないし
0258デフォルトの名無しさん
2009/07/07(火) 01:36:46わかるから
0259デフォルトの名無しさん
2009/07/07(火) 01:36:59苦学生おつ
>>256
よくわからんけどポインタの前でも見てるんじゃないの?
0260デフォルトの名無しさん
2009/07/07(火) 01:54:02それをfree関数のランタイムコードが調べてるってことですかね。すごいな、考えた人。
やっぱりC言語はすごい。世界征服まであとちょっとだ。
0261デフォルトの名無しさん
2009/07/07(火) 06:29:27どの変数を初期化していないんですか?
0262デフォルトの名無しさん
2009/07/07(火) 06:33:24ここでnedan[i]を表示してるけど初期化はされてないといわれてるんだけど理解してない?
0263デフォルトの名無しさん
2009/07/07(火) 06:37:39わかりました。
0264デフォルトの名無しさん
2009/07/07(火) 09:12:06そんなものはわからない。
Linuxとかだと、1mallocあたり4KBくらいずつ確保される。
(大きさによって確保の単位は変わる)
だからアドレス例外は4K+1B目じゃないと発生しない。
0265デフォルトの名無しさん
2009/07/07(火) 10:58:470266デフォルトの名無しさん
2009/07/07(火) 18:21:43ヒープ→動的確保→遅い
スタック→静的確保→早い
レジスタ→よくわからん→すごい早い
みたいなイメージなんだけどさ
0267デフォルトの名無しさん
2009/07/07(火) 18:24:36微妙に間違っている。
そのキーワードでぐぐってみることをお勧め。
まぁ、Cがどうこうって話じゃないからスレ違いだね。
0268デフォルトの名無しさん
2009/07/07(火) 18:31:06スタック:自動変数の置かれる領域。
レジスタ:最適化によっていろいろ置かれるCPU内の領域。
スタックでも動的確保はできるし、そもそもヒープの振る舞いはOS次第。
まして、速度はCPU次第でヒープが遅いとは一概には言えず。
# 確保処理にコストが発生すると言えば言えなくはないが、大抵は無視できる程度。
レジスタの割り当てはコンパイラが最適化に従って勝手に行なうので、通常は意識する必要なし。
逆に最適化を禁止してしまうと(register宣言を無視してでも)スタックの使用が強制される場合もあり。
# そうでなければ、自動変数のアクセスにブレークポイントを置くことができない。
0269デフォルトの名無しさん
2009/07/07(火) 18:58:22アーキテクチャから見えるレジスタだけでなく
物理レジスタのリネーミングまで考慮するのが一般的なCプログラマ
0270デフォルトの名無しさん
2009/07/07(火) 19:03:190271デフォルトの名無しさん
2009/07/07(火) 21:01:06何故ですか?
0272デフォルトの名無しさん
2009/07/07(火) 21:07:080273デフォルトの名無しさん
2009/07/07(火) 21:29:390274デフォルトの名無しさん
2009/07/07(火) 21:46:13高いのは翻訳本ってことが原因かも。
分厚いのはしょうがない。薄い本より厚い本のほうがいいよ。
0275デフォルトの名無しさん
2009/07/07(火) 21:49:020276デフォルトの名無しさん
2009/07/07(火) 21:51:050277デフォルトの名無しさん
2009/07/07(火) 21:51:50お金ができたら是非本を買ってくれ
良書だと思うものだけでいいから
0278デフォルトの名無しさん
2009/07/07(火) 21:55:590279デフォルトの名無しさん
2009/07/07(火) 22:08:330280デフォルトの名無しさん
2009/07/07(火) 23:18:510281デフォルトの名無しさん
2009/07/07(火) 23:50:530282デフォルトの名無しさん
2009/07/08(水) 00:30:30クエリーパラメータを埋め込む際にパラメータが不要にエンコードされない、かつサイズをなるべく短くするために、
任意長のバイナリデータ(0x00含む)を62進(0-9a-zA-Z)で構成される文字列を作成する関数を作成したい。
(64進は何かしらの記号が入ってしまうため、避けます)
ネットで検索しても多倍長整数が用意された環境のものでの変換は見つかりますが、
多倍長整数を使わない変換だと64進数など2^n進数のみの情報しか見つかりませんでした。
エンコード、デコード関数の合計のステップ数を400程度以内としたいため多倍長整数は導入しない方針としたいです。
最大64bit整数型まで使える環境です。
上記を満たすロジックの考え方のヒントが思いつく方は教えてください。(あくまでC言語でお願いします)
こちらが考えている方法は、
エンコードは8バイトごとに11バイトのデータに変換していく方法です(データサイズは1.375倍)。
中身は余り(%)と商(/)を求めていくループを作成という一般的な?方法です。
8バイト未満となった場合は、適当に特殊処理を行います。
0283デフォルトの名無しさん
2009/07/08(水) 00:35:270284デフォルトの名無しさん
2009/07/08(水) 00:51:56その2文字がどのような実装でもエンコードされなければよいですが、
例えば、「_」(アンダースコア)などでもURLエンコードするブラウザがあります(AndroidのWebkit)。
不要にURLエンコードがクライアント側でされないようにしたいです。
(ブラウザによりURLエンコードされうる可能性を除外したいため、
0-9a-zA-Zのみであれば大丈夫だろうという判断をしています)
0285デフォルトの名無しさん
2009/07/08(水) 01:02:580286デフォルトの名無しさん
2009/07/08(水) 01:06:02あとBCDなんてのもあるし参考にしてみなよ
0287デフォルトの名無しさん
2009/07/08(水) 01:06:30すみませんが、Base62でお願いします。
0288デフォルトの名無しさん
2009/07/08(水) 01:10:57演算子の%と/を使うかまたは、ビットのみの操作で出来る実装だと思いました。
演算子の%と/を使えるようにするためには整数型に変換する必要があると思っています。
ビット操作のみで62進化の方法は私には分かりません。
0289デフォルトの名無しさん
2009/07/08(水) 01:11:050290デフォルトの名無しさん
2009/07/08(水) 01:12:240291デフォルトの名無しさん
2009/07/08(水) 01:14:05今要求してるのは2進化62進数でしょ?
0292デフォルトの名無しさん
2009/07/08(水) 01:14:40いや、違うだろ…
0293デフォルトの名無しさん
2009/07/08(水) 01:20:25そういうことでしょ
>エンコードは8バイトごとに11バイトのデータに変換していく方法です
0〜61つまり0〜63を一桁分にしてパックするかアンパックするかでしょ(1桁のうち2使わないだけで)
0294デフォルトの名無しさん
2009/07/08(水) 01:24:286ビットを62進数の一桁にするだけでしょ?
0295デフォルトの名無しさん
2009/07/08(水) 01:29:56それならBase64でよくね?
0296282
2009/07/08(水) 01:29:572^6は64なので6ビットを62進数の一桁にするのは不可能かと。
>>291
2進化62進数とは、2進数を用いて62進を表すという意味だと解釈しています。
それではないと思っています。
任意のバイナリ(バイトで言うと256進)を62進文字列に変換したいのです。
0297デフォルトの名無しさん
2009/07/08(水) 01:32:530299デフォルトの名無しさん
2009/07/08(水) 01:34:350300デフォルトの名無しさん
2009/07/08(水) 01:39:08じゃあ自分でBase32でも作れば?Base16とか
0301デフォルトの名無しさん
2009/07/08(水) 01:39:50あったなぁと調べたが分からなかった。
0302282
2009/07/08(水) 01:40:39ありがとうございます。
クエリーパラメータで入れられるぐらいのサイズ(HTTPでは2000程度)なので、
車庫ファイルのサイズがバカにならないと考えています。
0303デフォルトの名無しさん
2009/07/08(水) 01:40:390304デフォルトの名無しさん
2009/07/08(水) 01:40:470=0,1=1,...,W=58,X=59,YY=60,YYY=61,YYYY=62,Z=63みたいな
0305デフォルトの名無しさん
2009/07/08(水) 01:42:31Y0=60,Y1=61,Y2=62で
0306デフォルトの名無しさん
2009/07/08(水) 01:42:41それは符号長が長くなるだろ
0307デフォルトの名無しさん
2009/07/08(水) 01:43:44Base62の根拠はBase64のエンコードで使う62=+ 63=/を避けたいってことなんでしょ?
だから使える文字があまるようにBase32にすればいい桁増えるけど
0308デフォルトの名無しさん
2009/07/08(水) 01:45:280309デフォルトの名無しさん
2009/07/08(水) 01:46:01虫が良すぎる
どれか一つ諦めろ
0310デフォルトの名無しさん
2009/07/08(水) 01:47:16無理だよ
Base64の仕様をみたほうがいい
2進数や16進数での切りの悪い62進数という時点で
0311デフォルトの名無しさん
2009/07/08(水) 01:47:28速度が〜とか言ってないし、圧縮率もBase64に劣ることも認識してるし
0312デフォルトの名無しさん
2009/07/08(水) 01:48:38無理だよね。
Base64の仕様を見る限り、切りの悪い10進数なんて表現できるわけがないよね。
0313デフォルトの名無しさん
2009/07/08(水) 01:49:130-9a-zA-ZだってURLエンコードしようと思えば出来るし、何かの弾みでされるかもしれないが
それは不正データとして弾いちゃっていいの?
0314デフォルトの名無しさん
2009/07/08(水) 01:49:43なんでそこまで心配してあげるの?
0315デフォルトの名無しさん
2009/07/08(水) 01:50:58Base64エンコードした場合のバイト数は11
Base32エンコードした場合のバイト数は13
誤差だと思うけど
記号を嫌う以上はこのくらいの増分は覚悟しないと
0316デフォルトの名無しさん
2009/07/08(水) 01:51:48でもBase32にして符号長を伸ばすことも
普通に割り算と余りでBase62を作る遅い方法も許せないんだろ?
両方に並々ならぬこだわりがあるんじゃないの
0317デフォルトの名無しさん
2009/07/08(水) 01:52:53ヒマだから的はずれのレスにつっこんでるだけだよ
自演と思いたければどうぞ?
0318デフォルトの名無しさん
2009/07/08(水) 01:53:360319デフォルトの名無しさん
2009/07/08(水) 01:54:200320282
2009/07/08(水) 01:55:04「サイズをなるべく短くするために」を実現するためにBase62なのです。
速度はあまり求めていません。
Base64と同じ仕様である必要はありません。
>>313
弾いてよいとさせて下さい。
>>315
それなら自作版のBase62を作ります。それぐらいバイト数に対する要求度も高いです。
>>316
282に書いたのは割り算と余りでBase62を作る方法ですが、気に入らないのは、あくまで圧縮率で
速度ではありませんでした。
0321デフォルトの名無しさん
2009/07/08(水) 01:55:23> 普通に割り算と余りでBase62を作る遅い方法も許せない
というのは書いてなくね
0322デフォルトの名無しさん
2009/07/08(水) 01:55:288バイトごとに剰余リセットしていいなら簡単じゃないか。
64bit整数があるならそれ使えばいいし、
ないなら32bit整数のペアで表せばいい。
0323デフォルトの名無しさん
2009/07/08(水) 01:57:36割り算と余りより圧縮率上げようとするならBase62じゃなくなるぞ
新しい圧縮フォーマットを作る話になる
0324デフォルトの名無しさん
2009/07/08(水) 01:58:27割り算と余りより圧縮率上げよう、なんて書いてなくね?
0325デフォルトの名無しさん
2009/07/08(水) 01:59:02それでいいとおっしゃってるw
好きなようにやらせればいいんでないの。
わざわざ変換前の数字を62進で計算したあとエンコードとかw
シフト演算もろくに使えないのに
0326デフォルトの名無しさん
2009/07/08(水) 01:59:17いや、ここにきて
>割り算と余りでBase62を作る方法ですが、気に入らないのは、あくまで圧縮率
と書いてるぜ
0327デフォルトの名無しさん
2009/07/08(水) 02:00:02その誤読はわざと?
0328デフォルトの名無しさん
2009/07/08(水) 02:01:320329デフォルトの名無しさん
2009/07/08(水) 02:01:49どこで悩んでるのかわかんないんだけど。
2進化62進数でいいの?それとも、62進数がいいの?
0330デフォルトの名無しさん
2009/07/08(水) 02:03:21やりたい方向としてはBase64なんだけど62に収めるという独自仕様らしいよ
0331デフォルトの名無しさん
2009/07/08(水) 02:03:24そうならすまんかった。
0332デフォルトの名無しさん
2009/07/08(水) 02:03:45ややこしくなるからお前が答えるな
0333デフォルトの名無しさん
2009/07/08(水) 02:05:390334282
2009/07/08(水) 02:08:128バイトごとに11バイトのデータに変換するなんてベタで無駄のある処理をしてしまうより、
もっとスマートな方法がないかを模索したかったのです。
ご意見ありがとうございます。
まとめると、多倍長整数を使わない場合は、
2^n進数ならスマートに出来るけども、
2^n進数以外ではスマートにならないし、一般的な方法もあまりないということでしょうかね。
0335デフォルトの名無しさん
2009/07/08(水) 02:09:35です
62進数の場合は割り算などを駆使して分解したあとエンコードするしかないかと
0336デフォルトの名無しさん
2009/07/08(水) 02:14:52元のバイト列を一つのでっかい整数だと思って62進数に変換すりゃいいじゃん
ああ、それで多倍長整数とか言ってたのか?
そんなもんなくても変換できるぞ
割り算の筆算と同じだから
0337デフォルトの名無しさん
2009/07/08(水) 02:18:33多倍長整数なんてなくても、普通に62で割って余りを伝搬させて行くだけでしょ。簡単じゃん。
0338デフォルトの名無しさん
2009/07/08(水) 02:20:46char dst[XXXX*4]; //バッファ
int main(){
int j=0;
for(int i = 0; i < XXXX; ++i){
int tmp = tmp*62 + src[i];
dst[j] = tmp % 62;
tmp /= 62;
j++
if(tmp >= 62){
dst[j] = tmp % 62;
tmp /= 62;
j++
}
}
while(tmp > 0){
dst[j] = tmp % 62;
tmp /= 62;
j++
}
}
テキトーだからきっと間違ってる
0339デフォルトの名無しさん
2009/07/08(水) 02:23:30Base64と同じでビット単位で区切ったあと
62,63の場合は・・というif文入れれる方法もあるけど
0340デフォルトの名無しさん
2009/07/08(水) 02:28:54これならきっとURLエンコードされないって。
クエリ文字列は2chのread.cgiみたいにパス風の文字列にしてさ。
0341282
2009/07/08(水) 02:30:35組み込みの演算子ではなく、自作の割り算を作ればよいということですね。
その辺はよく知らなかったため、調べてみたいと思います。
>>338
なんか、ソース自体は自分が考えていたよりスマートですね。
想定する動作になるか確認するのに少し時間が必要です。
これが>>336 >>337さんが言っている方法ですかね。
0342デフォルトの名無しさん
2009/07/08(水) 02:31:18自己レス
肝心の所で大間違いしてた
>int tmp = tmp*62 + src[i];
tmp = tmp*256 + src[i];
あとtmpは要main直後宣言(=0)
0343デフォルトの名無しさん
2009/07/08(水) 02:31:57この程度の部品関数ならそんなに時間かからねえってw
0344デフォルトの名無しさん
2009/07/08(水) 02:38:38uint64 n;
n = src[i] << 8*7 | src[i+1] << 8*6 | …
を62で割ったりする話だと思ってた。
0346デフォルトの名無しさん
2009/07/08(水) 04:30:520347デフォルトの名無しさん
2009/07/08(水) 09:03:23以前割られる数aと割る数bと商を入れるポインタと余りを入れるポインタを渡して
a/bとa%bの計算をして結果をポインタに入れる関数を作ってどんな最適化がされるかな?と
やってみた事があるんだけど、割り算の計算が完了した時点で2つのレジスタに商と余りと
計算ができているのにポインタに詰め込む段階で片方のレジスタの値しか書き込まず
もう一度割り算をしてやっぱり片方のレジスタの値を書き込むだけみたいな
Cで書いた通りに実行されていて泣いたw
0348デフォルトの名無しさん
2009/07/08(水) 10:22:41typedef int (*tenarray)[10];
int main(void){
int i,j;
char d[] ={
'a','b','c','d','e',
'A','B','C','D','E',
'1','2','3','4','5'};
char (*c)[5] = (tenarray)d;
for(i = 0; i < 3; i++){
for(j = 0; j < 5; j++){
}
printf("%c",c[i][j]);
}
printf("\n");
return 0;
}
0349デフォルトの名無しさん
2009/07/08(水) 10:27:22ni.c: In function ‘main’:
ni.c:11: 警告: initialization from incompatible pointer type
./ni
A1
教材のプログラムなんですが上手く実行できません。
期待される実行結果は
abcde
ABCDE
12345
です。
0350デフォルトの名無しさん
2009/07/08(水) 10:34:33写し間違えているか
教材を作った奴が分かっていないか
うまくいかないことを教えようとしているか
どれだろうね
0351デフォルトの名無しさん
2009/07/08(水) 10:35:44キミが何をしたいのかいまいち不明だが、
その結果を期待するだけなら
typedef int (*tenarray)[10]; → typedef char (*tenarray)[5];
と、for文のとこは
for(i = 0; i < 3; i++){
for(j = 0; j < 5; j++){
printf("%c",c[i][j]);
}
printf("\n");
}
だろう?
元がこれで、別な何かをやりたくて改変してるように見えるが・・・
0352デフォルトの名無しさん
2009/07/08(水) 10:37:03ふたつある printf の行の位置が間違っている。
両方とも } の上の行(ループの内側)に移動すればいい。
0353デフォルトの名無しさん
2009/07/08(水) 10:37:55codepad
ttp://codepad.org/
に貼って実行してみろ。
個人情報が含まれないように気をつけてね。
0354デフォルトの名無しさん
2009/07/08(水) 10:39:59教材を忠実に写しています。
351のプログラムは質問する前にやってみましたができません。
教科書はポインタで一次元配列を二次元配列に変換できることを説明しています。
0355デフォルトの名無しさん
2009/07/08(水) 10:42:25まず変数cの領域が足りてないから
c[1] とかにアクセスしちゃだめだ
0357デフォルトの名無しさん
2009/07/08(水) 10:43:45そのやってみてできなかったことをかけよ。
こっちは実際にやってみてできることを確認した上で答えてるんだが。
0358デフォルトの名無しさん
2009/07/08(水) 10:46:11すみません。
エラーは出ませんが実行結果は同じです。
0360デフォルトの名無しさん
2009/07/08(水) 10:47:36>>351は>>352の言うとおり、上の行(ループの内側)に移動してるだろ?
0361デフォルトの名無しさん
2009/07/08(水) 11:36:30スゲー馬鹿がいるw
0362デフォルトの名無しさん
2009/07/08(水) 11:42:160363デフォルトの名無しさん
2009/07/08(水) 12:08:23すいません、質問があります。
1〜100000000まで100000000行のデータがあります。
いきなり最後の100000000という整数を読み込むことは出来ますか?
一列目にパケットNOがついているCSVデータの行数を取得するのに、
最後の数字から最初の数字の差分を出したいです。
一行一行カウントしていくのは時間がかかり過ぎます。
宜しくお願いします。
0364デフォルトの名無しさん
2009/07/08(水) 12:12:30最後のひとつ前の改行から整数をひとつ読めばいいかと
0365デフォルトの名無しさん
2009/07/08(水) 12:36:48ありがとうございます!
解決しました!
0366デフォルトの名無しさん
2009/07/08(水) 12:50:43とはどういう意味ですか?詳しくお願いします。
0367デフォルトの名無しさん
2009/07/08(水) 12:54:29もっと詳しくお願いします
0368デフォルトの名無しさん
2009/07/08(水) 12:54:57i番目の要素での値 s[i] から (同じ位置での) t[i] を引いた値を戻します
0369デフォルトの名無しさん
2009/07/08(水) 13:07:26ありがとうございます。理解できました。
0370デフォルトの名無しさん
2009/07/08(水) 14:01:03ただ単にprintfの位置がずれているだけでした。
>>348のプログラムはprintfのところ意外はちゃんと教科書を写したものですが
他のところは教科書のミス印刷でした。
0371、
2009/07/08(水) 14:50:47ある変数のポインタを特定数だけ進めたいです。
char A;
A = A + 40;
上記だと左のオペランドが、左辺値になってませんというエラーがでます。
0372デフォルトの名無しさん
2009/07/08(水) 14:57:41Aってリテラル参照してるchar*だったりしないか?
0373デフォルトの名無しさん
2009/07/08(水) 15:02:162 #include <stdlib.h>
3 #include <string.h>
4
5 int main(void){
6 char *p;
7
8 p = calloc(1,20);
9 strcpy(p,"今日はいい天気だ");
10
11 p = realloc(p,40);
12 strcat(p,"公園にいこう\n");
13 printf(p);
14 free(p);
15 return 0;
16 }
0374、
2009/07/08(水) 15:02:310375デフォルトの名無しさん
2009/07/08(水) 15:07:590376デフォルトの名無しさん
2009/07/08(水) 15:10:30*** glibc detected *** ./re: realloc(): invalid next size: 0x08b88008 ***
======= Backtrace: =========
/lib/libc.so.6[0x8ec6ff]
/lib/libc.so.6(realloc+0x1a7)[0x8ee3f7]
/lib/libc.so.6[0x8ee741]
/lib/libc.so.6(realloc+0x3c)[0x8ee28c]
./re[0x80484c0]
/lib/libc.so.6(__libc_start_main+0xe0)[0x897390]
./re[0x80483a1]
0377デフォルトの名無しさん
2009/07/08(水) 15:11:02配列とポインタも「ほとんど同義」ではあるけど、「同じ」ではないよ。
っていうか、別物。
0378デフォルトの名無しさん
2009/07/08(水) 15:12:38IDもでない板で名無しで発言されてもなあ
0379デフォルトの名無しさん
2009/07/08(水) 15:13:4200110000-00111000 r-xp 00110000 00:00 0 [vdso]
00833000-0083e000 r-xp 00000000 fd:00 2493341 /lib/libgcc_s-4.1.2-20070925.so.1
0083e000-0083f000 rwxp 0000a000 fd:00 2493341 /lib/libgcc_s-4.1.2-20070925.so.1
00862000-0087d000 r-xp 00000000 fd:00 2493316 /lib/ld-2.7.so
0087d000-0087e000 r-xp 0001a000 fd:00 2493316 /lib/ld-2.7.so
0087e000-0087f000 rwxp 0001b000 fd:00 2493316 /lib/ld-2.7.so
00881000-009d4000 r-xp 00000000 fd:00 2493317 /lib/libc-2.7.so
009d4000-009d6000 r-xp 00153000 fd:00 2493317 /lib/libc-2.7.so
009d6000-009d7000 rwxp 00155000 fd:00 2493317 /lib/libc-2.7.so
009d7000-009da000 rwxp 009d7000 00:00 0
08048000-08049000 r-xp 00000000 fd:00 2064664 /home/BA08126/cennshuu/re
08049000-0804a000 rw-p 00000000 fd:00 2064664 /home/BA08126/cennshuu/re
08b88000-08ba9000 rw-p 08b88000 00:00 0
b7e00000-b7e21000 rw-p b7e00000 00:00 0
b7e21000-b7f00000 ---p b7e21000 00:00 0
b7faf000-b7fb1000 rw-p b7faf000 00:00 0
bfdac000-bfdc1000 rw-p bffea000 00:00 0 [stack]
アボートしました
となり期待した実行結果が得られません。9行めの今日はいい天気だのところを他の文章にすると
上手くいくみたいなんです。
0380デフォルトの名無しさん
2009/07/08(水) 15:19:38UTF-8だと確保量が足りない
0381デフォルトの名無しさん
2009/07/08(水) 15:21:40printf("%d", strlen("今日はいい天気だ") );
を確認
20以上ならアウト
0382373
2009/07/08(水) 15:22:20分かりました。
有難うございました。
0383373
2009/07/08(水) 15:28:4724でアウトでした。
strlenは文字数を数える関数ですがなんで24になったのかが不思議です。
0384デフォルトの名無しさん
2009/07/08(水) 15:29:43別にポインタを進めたければ進めればいいよ。
>>371のAはcharなので40足すことは可能
>>374のAはchar配列なので代入不可能
どちらにしてもポインタを進めたり戻したりしようとしてない
0385デフォルトの名無しさん
2009/07/08(水) 15:30:07文字数じゃないよ
バイト数だよ
0386デフォルトの名無しさん
2009/07/08(水) 18:27:01strlenはバイト数を数える
1文字に何バイト使うかは文字コードセットでまちまちだ
0387デフォルトの名無しさん
2009/07/08(水) 18:36:51>>383は3バイト×8文字で24だったわけね
0388デフォルトの名無しさん
2009/07/08(水) 19:54:29OSがプロセスごとにメモリー割り振って、プロセス終了したら
勝手に解放するもんだと思ってるんだけど。
0389デフォルトの名無しさん
2009/07/08(水) 19:57:100390デフォルトの名無しさん
2009/07/08(水) 20:01:19他プロセスと共有されているようなメモリ(mallocしたあとに
forkして、かつ、copy-on-writeのシステムの場合とか)は
解放されないかもしれないよ
0391デフォルトの名無しさん
2009/07/08(水) 20:04:17突然その話をするということは解放されなかったということ?
0392デフォルトの名無しさん
2009/07/08(水) 20:15:07少し修正してプログラム走らせたびに、無駄なメモリ食ってんのかな
と思ったり。それだったら、厳格にメモリ管理しないといけないなって
大した理由もなくゴメン
0393デフォルトの名無しさん
2009/07/08(水) 20:18:050394デフォルトの名無しさん
2009/07/08(水) 20:19:39OSが親切なら解放してくれる。
だが標準Cの仕様上は自分でfreeしなければならないことになっている。
MALLOC
ttp://kmaebashi.com/programmer/c_yota/malloc.html
ここが熱く語っているので読んでみ。
0395デフォルトの名無しさん
2009/07/08(水) 20:34:49今、軽く目通したけど面白かった
読む前は、見事にjavaとかのD言語のGCっていいねって思ってましたw
0396デフォルトの名無しさん
2009/07/08(水) 21:27:590397デフォルトの名無しさん
2009/07/08(水) 22:11:060398デフォルトの名無しさん
2009/07/09(木) 00:04:5964bitバスならば、8バイト境界をまたぐ可能性があるから、アドレスは8の倍数にならないといけないとはわかるのですが、32bitバスなら、いずれにしても4バイト境界をまたぐ必要がありますよね
ならアライメントは4の倍数でも不都合が無いような気がします
0399デフォルトの名無しさん
2009/07/09(木) 00:07:22設計した人に聞いた方がいいよ
0400デフォルトの名無しさん
2009/07/09(木) 00:09:34コンパイラのオプションでアライメントは変更できるよ
動作は遅くなるけど
0401デフォルトの名無しさん
2009/07/09(木) 00:15:39ここまでメモリ増えた状態でそこまで詰めてどうするんだろうとか思うけど
0402デフォルトの名無しさん
2009/07/09(木) 00:17:00http://www.intel.com/Assets/PDF/manual/253665.pdf
0403デフォルトの名無しさん
2009/07/09(木) 00:21:55int sub(int **a)として渡せるはずですが何故か
セグメンテーションとか言われて落ちます
0404デフォルトの名無しさん
2009/07/09(木) 00:23:03int sub(int (*a)[10]) でないと渡せぬぞよ
0405デフォルトの名無しさん
2009/07/09(木) 00:24:26そうなのですか?大学の先生は大丈夫と言っていたのですが
0406デフォルトの名無しさん
2009/07/09(木) 00:25:230407デフォルトの名無しさん
2009/07/09(木) 00:26:040408デフォルトの名無しさん
2009/07/09(木) 00:26:48渡すだけなら大丈夫だろうけどさ
0409デフォルトの名無しさん
2009/07/09(木) 00:26:59続きは無いのですが、渡せると言ってました。
0410デフォルトの名無しさん
2009/07/09(木) 00:27:010411デフォルトの名無しさん
2009/07/09(木) 00:29:56アクセスすると落ちてしまうのですが
どうしてですか?
0412デフォルトの名無しさん
2009/07/09(木) 00:31:440413デフォルトの名無しさん
2009/07/09(木) 00:39:370414デフォルトの名無しさん
2009/07/09(木) 00:50:28蛇足だけどx86ってPentiumの時代からデータバスは64ビットだよ。
0415デフォルトの名無しさん
2009/07/09(木) 01:08:530416デフォルトの名無しさん
2009/07/09(木) 01:17:570417デフォルトの名無しさん
2009/07/09(木) 01:20:370418デフォルトの名無しさん
2009/07/09(木) 01:26:270419デフォルトの名無しさん
2009/07/09(木) 01:28:390420デフォルトの名無しさん
2009/07/09(木) 01:40:54nt sub(int **a)
で、a[1][2]をどうサクセスするんだろうか?
0421デフォルトの名無しさん
2009/07/09(木) 02:45:19これは、main関数の呼び出し元側で、
引数の数分の文字列への先頭ポインタを配列にしているから。
逆に、int sub(int **a)でアクセスさせようとしたいなら、
int [10]へのポインタを個数分配列にすればいけると思う。
0422デフォルトの名無しさん
2009/07/09(木) 02:53:27こんないい加減だから卒業生にうらまr・・・ケフンケフン
0423デフォルトの名無しさん
2009/07/09(木) 02:58:270424デフォルトの名無しさん
2009/07/09(木) 04:05:47char **argv
はcharの2次元配列ではない。
0425デフォルトの名無しさん
2009/07/09(木) 04:07:06引数の数分の文字列への先頭ポインタを配列にしているから
0426デフォルトの名無しさん
2009/07/09(木) 07:33:43int **aはint*が並んでるだけ
0427デフォルトの名無しさん
2009/07/09(木) 09:11:312次元配列と、ポインタの配列の違いは。
0428デフォルトの名無しさん
2009/07/09(木) 09:14:34int a[10][10]
を
int sub(int **a)
で渡せると思う方がどうかしてる
0429デフォルトの名無しさん
2009/07/09(木) 11:27:17ポインタの配列と二次元配列について
わざわざ一項ずつ割いて説明しているのだから
初心者向けの本しかかけない日本人による最新の教科書なら
それこそびっしり、微にいり細にいり書いてあるじゃろ。
教科書をちゃんと読め、としか。
0430デフォルトの名無しさん
2009/07/09(木) 12:40:03入門書が多すぎます
関数のポインタとか
スタックとか
ぜんぜん説明してくれてないじゃないですか!!
0431デフォルトの名無しさん
2009/07/09(木) 13:56:29初心者こそポインタを使わないで済ませるコーディングを勉強すべき
0432デフォルトの名無しさん
2009/07/09(木) 14:06:45ポインタ自体はむしろ増えるけど、ほとんど参照レベル1ですむ。
0433デフォルトの名無しさん
2009/07/09(木) 14:08:150434デフォルトの名無しさん
2009/07/09(木) 15:01:300435デフォルトの名無しさん
2009/07/09(木) 15:30:22だが、おまえは使うな
0436デフォルトの名無しさん
2009/07/09(木) 15:31:330437、
2009/07/09(木) 16:19:16このような制御文を入れたいのですが偶数か奇数かの判定の仕方がわかりません。よろしくお願いします。
0438デフォルトの名無しさん
2009/07/09(木) 16:25:170440デフォルトの名無しさん
2009/07/09(木) 17:52:19#include <stdio.h>
#define N 10
int main(void){
int i, j = 1, x, y;
int d[N][N]={};
/* 三角形を作成 */
for (i = 1 ; i < N ; i++){
d[i][0] = 1;
while (j <= i - 1){
d[i][j] = d[i-1][j-1] + d[i-1][j];
j ++;
}
}
/* 三角形の表示 */
for (y = 0; y < N; y++) {
for (x = 0; x < N-y; x++)
printf(" ");
for (x = 0; x < y; x++)
printf("%3d ", d[x][y]);
printf("\n");
}
return 0;
}
と書きましたが、すべての要素がゼロになってしまいます。
なぜでしょうか?教えてください。
0441デフォルトの名無しさん
2009/07/09(木) 20:18:420442デフォルトの名無しさん
2009/07/09(木) 21:13:440443デフォルトの名無しさん
2009/07/09(木) 22:47:24> /* 三角形を作成 */
> for (i = 1 ; i < N ; i++){
ここを抜けた後のdの値
d = {{1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 0, 1, 0, 0, 0, 0, 0, 0, 0},
{1, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{1, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{1, 0, 0, 0, 0, 1, 0, 0, 0, 0},
{1, 0, 0, 0, 0, 0, 1, 0, 0, 0},
{1, 0, 0, 0, 0, 0, 0, 1, 0, 0},
{1, 0, 0, 0, 0, 0, 0, 0, 1, 0},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 1}}
もう一度良く見直してご覧
0444デフォルトの名無しさん
2009/07/09(木) 22:52:160445デフォルトの名無しさん
2009/07/09(木) 22:59:050446デフォルトの名無しさん
2009/07/09(木) 23:07:35マルチポスト乙。
マルチポスト - Wikipedia
ttp://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88
0447デフォルトの名無しさん
2009/07/09(木) 23:33:16別のスレに回答しておいた。
出力結果のサンプルはこんな感じ。
1
1 1
1 2 1
1 3 3 1
0448282
2009/07/10(金) 03:28:23>>336とか>>338とか見てて思ったんだが、
単なる数値とみなすと、0扱いのもだと、最悪0バイトの出力になったりする。
デコードを可能にするため、事前に入力バイトから出力バイトが決定されるようになってるか、
頭にバイト数情報をつけないといけないと思ってる。
あと、単純に文字列を数値とみなすやり方だと、62進変換の過程で、
入力バッファと同じ大きさのバッファが必要になってしまうと思ってる。割る処理で割ったデータを残すため。
これも避けたい。仮にバッファを取ってしまうのを許すとして、デコードのまともに動く実装が?の状態。
>>299>>346さんのご指摘にあるようなZIPとかの出現コードの偏りによる圧縮は考えない場合、
エンコード時の理論値最高圧縮は2^5.95 ≒ 62。8/5.95≒1.344倍ぐらいになると思っていて、
今の1.375よりもう少し詰められるはずですが、内部バッファの確保が許されないと無理でしょうかね?
とりあえず、自作版のBase62はhttp://codepad.org/tj6adTYMにアップしといた。
0449初心者No1
2009/07/10(金) 13:38:43次に出現するブロックの予告部分がうまくできません。
srand((unsigned)time(NULL)); //現在時刻を取得?
block_type = rand() % 18; //取得した時刻をブロックの種類で割った余りで出現ブロックの決定?
と、解読もままならない状態なのですが・・・
これの次点で来るブロックがわかる方法ってありますか?
取得した現在時刻に1を足すなど、がむしゃらにやっては見たもののうまくいかないので
わかる方がいらっしゃいましたら教えてください。
質問の仕方も悪いのですが、よろしくお願いします。
0450初心者No1
2009/07/10(金) 13:39:25sage忘れました
0451デフォルトの名無しさん
2009/07/10(金) 13:40:43ソース見せて
0453デフォルトの名無しさん
2009/07/10(金) 13:50:44それは残念。まあしかたないね
0454449
2009/07/10(金) 13:58:07そもそも乱数取得なのに次に来るのがわかること自体すでに乱数じゃないかなと思った・・・w
どうもすいませんでしたー。
スルーでお願いします
0455デフォルトの名無しさん
2009/07/10(金) 14:06:16int myrand(int chk_next_flag)
{
static int pool;
int ret;
if(chk_next_flag) return pool;
ret=pool;
pool=rand();
return ret;
}
0456デフォルトの名無しさん
2009/07/10(金) 14:10:498->11じゃ、62で割りきれんからとでんでもになるんじゃ?
0457449
2009/07/10(金) 14:47:44すいません・・・まったく意味がわからないです。
いっそのこと予告しているのを次に落とすブロックにしちゃえばいいやと思ったら
自己解決できちゃいました・・・(==;
>>451
>>455
ありがとうございました。
0458デフォルトの名無しさん
2009/07/10(金) 18:54:47>>455 のは その予告をうまく分離できるように細工したコードだと思うよ
通常の利用シーンでは myarand(0) で呼び出し
予告値を得るときには myarand(1) で呼び出し
0459デフォルトの名無しさん
2009/07/10(金) 19:04:00(double)rand()%RAND_MAX*(b-a)+a
とかやったほうがいいの?それともがんばってもそんなに変わらないかな?
0460デフォルトの名無しさん
2009/07/10(金) 19:54:18最近の乱数発生器は大抵かわらない。
と思ってたらカルドセプトなんとかっていうゲームが罠にはまってたな。
0461デフォルトの名無しさん
2009/07/10(金) 20:22:520462デフォルトの名無しさん
2009/07/10(金) 20:31:44あれは、普通に標準関数の乱数を使っておけばよかったのに、
自作したり変に工夫したりして自爆したんじゃないかと思う。
0463デフォルトの名無しさん
2009/07/10(金) 20:52:01Lagged-Fibonacci を採用する実装が増えたとか (又聞き)。
個人的には MT の実数版を使ってるけど。
0464デフォルトの名無しさん
2009/07/10(金) 22:11:35char* static_func()
{
static char* p;
char s1[20] = "foo";
char *s2 = "bar";
p = strcat(s1, s2);
return p;
}
printf()すると「1234イ」とか出ます。
puts()だとちゃんと表示されるんですが、何故ででしょうか。
0465デフォルトの名無しさん
2009/07/10(金) 22:13:510466464
2009/07/10(金) 22:13:53printf()の場合 「foobイ」
puts()の場合 「foobar」
0467デフォルトの名無しさん
2009/07/10(金) 22:14:53char s1とchar *s2 が関数 static_func()を抜けた時点で消滅しているので
未定義動作です
0468464
2009/07/10(金) 22:21:13なるほど。ポインタを返しても参照先のs1、s2が消えるからおかしくなるんですね。
puts()で表示されるのは何故なんでしょうか。
0469デフォルトの名無しさん
2009/07/10(金) 22:24:39それも未定義動作のうちです
putsで表示されるかもしれませんし、HDDがフォーマットされるかもしれません
0471デフォルトの名無しさん
2009/07/10(金) 22:27:58引数の数が違います
"恐らく"ローカル変数s1、s2はスタック上に取られているので、puts()と
printf()で破壊される文字数が異なるのだと思います
しかしそれはそれとしてこのような事はしないようにしましょう
0472デフォルトの名無しさん
2009/07/10(金) 22:48:33HDDが〜ってよくきくけどほんとにそんなことが起こったことがあるの?
0473デフォルトの名無しさん
2009/07/10(金) 22:50:51どういう動作をしたとしても言語仕様的には間違ってないって意味だろ
0474デフォルトの名無しさん
2009/07/10(金) 22:58:50エキスパートCプログラミングに、大昔のIBM-PCのモニタから
発火させる方法が書かれていた
つまりIBM-PCの時代は未定義動作を起こすと本当に火事
になる可能性があったんだよ
0475デフォルトの名無しさん
2009/07/10(金) 23:28:260476デフォルトの名無しさん
2009/07/10(金) 23:31:140477デフォルトの名無しさん
2009/07/10(金) 23:33:45ちょっと前のウィルスにはBIOSを破壊したり
ものすごい勢いでディスプレイの解像度を切り替えたり
ハードディスクのブートエリアに潜入して
低レベルフォーマット以外を拒否ったり
そういう破滅的なものもあったけど
今はないねぇ。
0478デフォルトの名無しさん
2009/07/10(金) 23:34:420479デフォルトの名無しさん
2009/07/10(金) 23:36:32すぐバレるからじゃないの?
トロイの木馬形式にすると発病まで時間がかかるから
その間に感染を拡げるし
0480デフォルトの名無しさん
2009/07/10(金) 23:37:03そりゃ、きんたまウィルスのような人生を破壊するウィルスのほうが優れているのでは?自殺者もでるくらいだし。
0481デフォルトの名無しさん
2009/07/10(金) 23:40:300482デフォルトの名無しさん
2009/07/10(金) 23:43:10賢明に「I Love you」と書かれていると、人はなぜか開いてみたくなる。
意味不明な内容のメールに添付ファイルがついていると、人はなぜか開いてみたくなる。
タスクバーに目玉のアイコンが表示されると、人はなぜかクリックしたくなる。
「押してはだめだ」と書かれたダイアログが表示されると、人はなぜか押してみたくなる。
で、発病^^
0483デフォルトの名無しさん
2009/07/10(金) 23:49:03ゲイツ・ウイルス
0484デフォルトの名無しさん
2009/07/10(金) 23:53:18それは賢明だね。
0485デフォルトの名無しさん
2009/07/11(土) 00:23:03そうねえ。
知らない人からのメールの添付ファイルに疑いを持たない時代だったからね
0486デフォルトの名無しさん
2009/07/11(土) 00:27:150487デフォルトの名無しさん
2009/07/11(土) 00:28:090488デフォルトの名無しさん
2009/07/11(土) 06:24:56s1とs2はpにコピーされてるので関係ないだろ
問題はpの領域が確保されてないこと
static char p[256];とかなら255バイトまでなら問題ない
0489デフォルトの名無しさん
2009/07/11(土) 06:27:47strcpy( )じゃなかった
0490デフォルトの名無しさん
2009/07/11(土) 06:32:18言い切れないんじゃないかな
関数無いで新しい領域を確保して第一引数と第二引数のコピーを作るとも作らないとも書いてない
0491デフォルトの名無しさん
2009/07/11(土) 06:38:32つまり>>467のいう方向で考えた方がいい
原本というかANSI?の規格をみたわけじゃないので言い切れない部分もあるけど
0492デフォルトの名無しさん
2009/07/11(土) 06:42:010493デフォルトの名無しさん
2009/07/11(土) 09:59:00strcpy()もstrcat()も第一引き数が格納先になるんだからs1をロストする時点でダメ以外の回答は有り得ないじゃないか。
0494デフォルトの名無しさん
2009/07/11(土) 10:01:23KYですまん。
0495デフォルトの名無しさん
2009/07/11(土) 10:41:570496デフォルトの名無しさん
2009/07/11(土) 12:35:310497デフォルトの名無しさん
2009/07/11(土) 16:27:320498デフォルトの名無しさん
2009/07/11(土) 16:32:08例えば画像ファイル(HEIGHT × WIDTH)があって
それにラベリングがしてあるとします
そのラベリング値がpointのときの面積を計算しているのですが
たまに止まってしまいます・・・
毎回ではないですが、入力画像(顔の撮影)によって
セグメンテーション違反によって止まってしまします・・・・
double mensize(unsigned char (*image)[WIDTH],int point){
int i,j;
double total;
total=0.0;
for(i=0;i<HEIGHT;i++){
for(j=0;j<WIDTH;j++){
//printf("%d ",image[i][j]);
if(image[i][j] == point){
total++;
}
}
}
printf("total = %f \n",total);
if(total==0.0)return 0.0;
return total;
}
なぜでしょうか?
total++がたくさん実行されるとダメとか
そんなのは・・・ありませんよね?汗
ちなみに止まるときはコメントアウトしてるところを消して
どの値で止まるか見てるのですが、なんとも中途半端なところで
よろしくおねいがいします
0499デフォルトの名無しさん
2009/07/11(土) 16:45:310500デフォルトの名無しさん
2009/07/11(土) 16:46:31↓これで全ピクセルがカウントされるてHEIGHT*WIDTHが表示されるし・・・
void main()
{
unsigned char image[HEIGHT][WIDTH] = {0};
mensize(image, 0);
}
0501デフォルトの名無しさん
2009/07/11(土) 16:50:490502501
2009/07/11(土) 16:55:44mensize関数に渡してる第一引数に渡す二次元配列はどのように確保してる?
0503デフォルトの名無しさん
2009/07/11(土) 17:34:350504デフォルトの名無しさん
2009/07/11(土) 20:57:50>単なる数値とみなすと、0扱いのもだと、最悪0バイトの出力になったりする。
Base64でも一緒な
>あと、単純に文字列を数値とみなすやり方だと、62進変換の過程で、
>入力バッファと同じ大きさのバッファが必要になってしまうと思ってる。割る処理で割ったデータを残すため。
余りさえ伝播すればいいから1バイトで十分
0505デフォルトの名無しさん
2009/07/11(土) 23:20:40mensizeって男のサイズなの?
0506デフォルトの名無しさん
2009/07/11(土) 23:46:58ちんこの大きさか!!!
0507デフォルトの名無しさん
2009/07/12(日) 02:09:280508デフォルトの名無しさん
2009/07/12(日) 02:52:470509デフォルトの名無しさん
2009/07/12(日) 02:56:490510デフォルトの名無しさん
2009/07/12(日) 05:11:48b = *a
とした場合aの前の「*」とはどういう意味で、bはどうなるのですか?
0511デフォルトの名無しさん
2009/07/12(日) 05:34:22bがどうなるかは未定義
0512デフォルトの名無しさん
2009/07/12(日) 10:39:470513デフォルトの名無しさん
2009/07/12(日) 10:49:12ポインタにキャストしてないし
0514デフォルトの名無しさん
2009/07/12(日) 10:54:550515デフォルトの名無しさん
2009/07/12(日) 10:59:040516デフォルトの名無しさん
2009/07/12(日) 11:30:450517デフォルトの名無しさん
2009/07/12(日) 11:50:520518デフォルトの名無しさん
2009/07/12(日) 12:04:170519デフォルトの名無しさん
2009/07/12(日) 12:10:15多分
char *a;
char b;
だと思うけど b = *a は ; が無いからエラーかな
0520デフォルトの名無しさん
2009/07/12(日) 12:12:19「「*」とはどういう意味で、bはどうなるのですか」
という質問に対しては、*は間接演算子で、bに0x00000001というメモリアドレスが
さす内容が入りますよ、となるんではないでしょうか
0521デフォルトの名無しさん
2009/07/12(日) 12:13:180522デフォルトの名無しさん
2009/07/12(日) 12:16:47整数をキャストなしにアドレス値とみなすことは
保障されていないんじゃなかったか?
0523デフォルトの名無しさん
2009/07/12(日) 12:19:210524デフォルトの名無しさん
2009/07/12(日) 12:39:370525デフォルトの名無しさん
2009/07/12(日) 13:40:23unsigned char image_out[HEIGHT][WIDTH];
です
0526デフォルトの名無しさん
2009/07/12(日) 13:43:15>HEIGHTとWIDTHのサイズは?
も聞かれてるのに
まあスタックオーバーフローだろうな
0527デフォルトの名無しさん
2009/07/12(日) 13:43:20HEIGHTがいくつかということも聞かれてるようだよ
0528デフォルトの名無しさん
2009/07/12(日) 13:45:150529デフォルトの名無しさん
2009/07/12(日) 13:58:080530デフォルトの名無しさん
2009/07/12(日) 14:26:250531デフォルトの名無しさん
2009/07/12(日) 16:49:410532デフォルトの名無しさん
2009/07/12(日) 18:32:580533デフォルトの名無しさん
2009/07/12(日) 18:45:020534デフォルトの名無しさん
2009/07/12(日) 19:57:06>アドレス値⇔整数の相互変換は保障されてるけど
必ずしも保証されない。
>整数をキャストなしにアドレス値とみなすことは
>保障されていないんじゃなかったか?
そもそもキャストなしで代入、間接できない。
詳細は前にここに書いた
http://pc12.2ch.net/test/read.cgi/tech/1201153965/972
0535デフォルトの名無しさん
2009/07/12(日) 20:33:05特定の環境向けのプログラム(特にOS等)なら、大いに使っていいものもある。
つまり、環境依存ってことね。
だから、前提になる環境も含めて質問すればよい。
0536デフォルトの名無しさん
2009/07/12(日) 20:43:58未定義の解釈、ちょっと違くねぇか?
処理系定義と未定義の違いは>>535さんは理解してる?
まあ入門スレだからいいけど。
0537デフォルトの名無しさん
2009/07/12(日) 20:57:120538デフォルトの名無しさん
2009/07/12(日) 21:10:52C言語は型の大きさ(sizeof演算値)が、例えば整数なら
short <= int <= long
という大小関係のみで、具体値が仕様として決まっていないのでしょうか。
こうなっている理由などについて教えてください。
0539デフォルトの名無しさん
2009/07/12(日) 21:20:450540デフォルトの名無しさん
2009/07/12(日) 21:20:590541デフォルトの名無しさん
2009/07/12(日) 21:31:25それぞれの環境で最速最適なものを取りたいから。
int を最適なサイズにあわせる処理系が多いと思います。
0542デフォルトの名無しさん
2009/07/12(日) 21:43:42ちゃんと作ってないプログラムのケツを拭く様な仕様に
0543デフォルトの名無しさん
2009/07/12(日) 21:45:59具体的に大きさを決めてしまうと、環境によってはそれを実現するために多大なコストが必要になるから。
0544デフォルトの名無しさん
2009/07/12(日) 22:02:310545デフォルトの名無しさん
2009/07/12(日) 22:04:050546544
2009/07/12(日) 22:13:44列挙型の#defineを定義しない場合に得られる利点はなんでしょうか?
0547デフォルトの名無しさん
2009/07/12(日) 22:15:350548デフォルトの名無しさん
2009/07/12(日) 22:23:130549デフォルトの名無しさん
2009/07/12(日) 22:24:05#define fuga hoge
0550デフォルトの名無しさん
2009/07/12(日) 22:26:430551デフォルトの名無しさん
2009/07/12(日) 22:34:29enum {fuga};
とやるよりメモリを節約できます
0552デフォルトの名無しさん
2009/07/12(日) 22:35:36知識がどこか狂っとる。
#define fuga hoge
ってもういくら何でも重症患者w
0553デフォルトの名無しさん
2009/07/12(日) 22:40:22fuga(ponyo);
0554544
2009/07/12(日) 22:45:490555デフォルトの名無しさん
2009/07/12(日) 22:47:080556デフォルトの名無しさん
2009/07/12(日) 22:47:260557544
2009/07/12(日) 22:48:000558デフォルトの名無しさん
2009/07/12(日) 22:48:20大学教師から聞いたとかだったなw
どこの大学だよww
ゴミ教師
0559デフォルトの名無しさん
2009/07/12(日) 22:48:48残念ながら、enumシンボルを定義しただけではメモリ空間を消費しないのだよ。
つまり、>549みたいな阿呆なことを書いても全く「メモリ節約」なんて効果はないわけだ。
0560デフォルトの名無しさん
2009/07/12(日) 22:49:050561デフォルトの名無しさん
2009/07/12(日) 22:54:010562デフォルトの名無しさん
2009/07/12(日) 22:54:370563デフォルトの名無しさん
2009/07/12(日) 22:57:58コンパイラが使うメモリの節約だよ。
0564デフォルトの名無しさん
2009/07/12(日) 22:58:530565544
2009/07/12(日) 23:11:21なんとかやってみます。
0566デフォルトの名無しさん
2009/07/12(日) 23:27:450567デフォルトの名無しさん
2009/07/13(月) 00:03:03#defineをいっぱい列挙するようなやり方のことじゃないか?
0568デフォルトの名無しさん
2009/07/13(月) 00:04:27自分が入学した大学のレベルを呪え。
0569デフォルトの名無しさん
2009/07/13(月) 00:06:530570デフォルトの名無しさん
2009/07/13(月) 10:18:41プリプロセッサのメモリのことも考えてあげてー!
0571デフォルトの名無しさん
2009/07/13(月) 13:29:17WIDTH 640
HEIGHT 480です
すいません
0572デフォルトの名無しさん
2009/07/13(月) 14:10:16これ、
printf("%p ",&image[i][j]);
とかにして落ちるときどうなってるか見たいな。
0573デフォルトの名無しさん
2009/07/13(月) 14:40:010574デフォルトの名無しさん
2009/07/13(月) 14:54:290575デフォルトの名無しさん
2009/07/13(月) 15:04:49回答が
>>499>>500>>501>>502>>503>>526
0576デフォルトの名無しさん
2009/07/13(月) 15:07:04スタックに取るにしてはでかいかもな
0577デフォルトの名無しさん
2009/07/13(月) 15:16:32unsigned char image_out[HEIGHT][WIDTH];
を
static unsigned char image_out[HEIGHT][WIDTH];
としておけ
0578デフォルトの名無しさん
2009/07/13(月) 15:59:050579デフォルトの名無しさん
2009/07/13(月) 16:44:02どうあがいても一つのみの半角スペースまでの文字列を取ってきてしまいます。
先生がそうする方法がある、というようなことを言っていたのですが・・・。
調べても見つからないので。
0580デフォルトの名無しさん
2009/07/13(月) 16:46:380581デフォルトの名無しさん
2009/07/13(月) 17:09:370582デフォルトの名無しさん
2009/07/13(月) 17:14:05多重ループが小さな関数内の物ならreturnで抜けるという方法もあるけど
結局は前後のロジック次第じゃないかな?
0583デフォルトの名無しさん
2009/07/13(月) 17:17:170584デフォルトの名無しさん
2009/07/13(月) 18:21:05本体はC++のWin32プロジェクトで、そこからCの関数を呼んでいます。
Cの中でprintfを使った場合、その出力はどこへ行くのでしょう?
IDEの出力ウィンドウとコマンドプロンプトは見たのですが、
どちらにも何も表示されませんでした。
0585デフォルトの名無しさん
2009/07/13(月) 18:32:42C++ で開いた標準出力。
C++ がウィンドウアプリなら、標準出力は開いていないかも知れず
その場合はどこにも出力されない。
0586デフォルトの名無しさん
2009/07/13(月) 18:53:28わかりました。ありがとうございました。
0587デフォルトの名無しさん
2009/07/13(月) 20:24:44fgets(buf, BUFSIZE, stdin)で標準入力からの文字列をbufに格納して、bufの文字数をstrlen(buf)で取得
printf("%s", buf)でLength: x と表示させたいんだけど
Length: xの部分をどう書いてbufに代入すればいいんでしょうか?
0588デフォルトの名無しさん
2009/07/13(月) 20:30:100589デフォルトの名無しさん
2009/07/13(月) 20:43:24printf("Length %d\n", strlen(buf))
ではいけないのか?
改行コードも文字数に含まれるけど
0590デフォルトの名無しさん
2009/07/13(月) 20:50:26参照渡しというのは、変数のアドレスが指すところを直接書き換えてしまえ、
という考え方ですよね?
関数の戻り値で結果を返すのではなく、
関数のなかで、アドレスの中身を書き換えてしまう、
そういうものですよね?
0591デフォルトの名無しさん
2009/07/13(月) 20:53:41C言語は全て値渡しです
あなたの言う「参照渡し」は
正確にはポインタを値渡ししているだけです
0592デフォルトの名無しさん
2009/07/13(月) 21:04:07うぬ〜。良く分からんですたい(^^;
でも、参照渡しの考え方をちょっとでも知れただけで、俄然C言語に興味がわきました。
プログラミングはJavaで始めたので、これはいい機会と思ってC言語の勉強をします。
0593デフォルトの名無しさん
2009/07/13(月) 21:05:170594デフォルトの名無しさん
2009/07/13(月) 21:05:58ポインタもアセンブラでみるとメモリ上に配置されてるエリアにすぎませんから
0595デフォルトの名無しさん
2009/07/13(月) 21:07:120596デフォルトの名無しさん
2009/07/13(月) 21:44:17わかりやすいです。
最近の言語でポインタが使えないのも、個人情報保護との
類似で考えると分かりやすいですね。
0597デフォルトの名無しさん
2009/07/13(月) 21:52:56static書くの疲れるお
0598デフォルトの名無しさん
2009/07/13(月) 21:55:430599687
2009/07/13(月) 22:01:08サーバー側がLength: x をbufに格納してwrite()でユーザーに送信
ユーザー側がprintf("%s",buf)で文字数表示ってやりたかったんです
0600デフォルトの名無しさん
2009/07/13(月) 22:04:13必要がまったく無いじゃねえか
0601デフォルトの名無しさん
2009/07/14(火) 00:34:19最近の言語は参照型とかあるから個人情報保護的なアレはまた違う
0602デフォルトの名無しさん
2009/07/14(火) 00:36:19sprintf(buf, "Length: %d", strlen(buf));
ということ?
0603282
2009/07/14(火) 01:49:37どんなBase64の実装か知らないけど、手元のBase64じゃ、入力サイズの大きさに対して出力サイズも決まるな。
数値として0になるのはいいんだが、出力時にそれでは困るという話です。
割った値を持つ必要がない理由を教えてください。
>>448で示したものでは割った値を保持する必要があります。
0604デフォルトの名無しさん
2009/07/14(火) 01:50:49いい加減仕様決めろよww
0605デフォルトの名無しさん
2009/07/14(火) 03:50:300606デフォルトの名無しさん
2009/07/14(火) 03:54:010607デフォルトの名無しさん
2009/07/14(火) 03:55:25辺にこだわってみたけど微妙でしたとかそんなんじゃね?
0608デフォルトの名無しさん
2009/07/14(火) 03:57:43オナニーしてるだけだよ
0609デフォルトの名無しさん
2009/07/14(火) 13:44:09まさか0-9A-Za-zで62か?
文字セットを限定するメリットよりエンコード、デコード処理が
煩雑になるデメリットのがはるかに大きい
0610デフォルトの名無しさん
2009/07/14(火) 14:23:29最初にそう書いてあるじゃないか。
0611デフォルトの名無しさん
2009/07/14(火) 15:15:45PHPで十分じゃないの
0612デフォルトの名無しさん
2009/07/14(火) 15:17:59画面を消したりカーソルを移動するにはどうするですか?
0613デフォルトの名無しさん
2009/07/14(火) 15:20:530614デフォルトの名無しさん
2009/07/14(火) 15:28:43つーか、環境依存スレなりDOSプログラミングすれなりAPIスレなりで聞けば?
0615デフォルトの名無しさん
2009/07/14(火) 15:30:26void clearScreen() {system("cls");}
void cursorMoveToTopOfLine() {putchar('\r');}
0616デフォルトの名無しさん
2009/07/14(火) 16:29:36オナニーに理由は必要ないからなぁ。
0617デフォルトの名無しさん
2009/07/14(火) 16:30:59おまえは何のつもりで「アンシー」つってんだ。
エスケープシーケンスの話か?
0618デフォルトの名無しさん
2009/07/14(火) 16:36:240619デフォルトの名無しさん
2009/07/14(火) 19:13:510620デフォルトの名無しさん
2009/07/14(火) 20:10:43わかりました。あなたは世界を革命するしかないでしょう。
0621デフォルトの名無しさん
2009/07/14(火) 20:12:03アピをつかえばいいよ
0622デフォルトの名無しさん
2009/07/14(火) 20:48:040623デフォルトの名無しさん
2009/07/14(火) 21:50:24fprintf(stdout,"%s",a);
とやってpapoiと全ての文字列が表示されるのは
%sとやると配列の全てを表示してくれるからでしょうか?
0624デフォルトの名無しさん
2009/07/14(火) 22:17:500625デフォルトの名無しさん
2009/07/14(火) 22:54:25ビックリするほど頭悪いな
>どんなBase64の実装か知らないけど、手元のBase64じゃ、入力サイズの大きさに対して出力サイズも決まるな。
当たり前だろ
君にもわかるように256進数と62進数じゃなくて10進数と2進数にしようか
例えば10進数の「0010」という列を2進数で表すなら、
情報を失いたくなければ同じように上位に0を入れて00000000001010と表すに決まってる
君は「10進の0000を2進にしたら0になっちゃう!サイズわかんない!使えない!」って騒いでるのと同じ
これでもわからんなら知らん
0626282
2009/07/14(火) 23:06:53理論値である1.344倍に対応する入力サイズと出力サイズの比率を実現したいんだけども、
バッファサイズが入力サイズと同程度のサイズを用意せずに、
実現する方法は分からないな。
Base64やBase32は内部のバッファサイズを不要に大きくせずに、理論値最高圧縮が実現出来ています。
これだけ色々な人に見ていただいて、「ない」のであれば、「ない」ということで納得しますよ。
0627デフォルトの名無しさん
2009/07/14(火) 23:27:29入出力がストリームなら、バッファなんかchar2個で十分だろ
余りと桁上げの時の法だけ
Base64やBase32だって一緒(桁上げの法はいらないけど)
どんな頭悪い方法考えてるか知らないけど、わかんないなら素直にBase64にした方がいいと思うよ
お前頭悪いんだから
0628282
2009/07/14(火) 23:42:52ありがとうございます。
どうやら「桁上げ」が分からないということが分かりました。
割る処理で必要と考えていますがよいでしょうか。
>どんな頭悪い方法考えてるか知らないけど
ベースは>>448で、Base62変換するための一時領域(この領域に対して、%や/を実施する)を文字列で持つ方法です。
0629デフォルトの名無しさん
2009/07/15(水) 09:43:33理論値最高圧縮って…何か勘違いしてない?
簡単に言えばBase64は変換前と変換後のデータを単純にテーブルで置き換えてるだけ。
バッファの大きさはデータサイズと一切関係なし。処理速度がほんのちょっと違う程度。
出力のサイズは入力の1.33倍で固定。
0630デフォルトの名無しさん
2009/07/15(水) 10:05:176ビットで表せる数が0〜63の64通りでBase64
って最後の方のレスしか読んでないが。
0631デフォルトの名無しさん
2009/07/15(水) 10:28:12Base64はO(1)の空間とO(n)の時間ですむが,
Base62はO(n)の空間とO(n^2)の時間が必要(入力データを書き換えられない場合).
0632デフォルトの名無しさん
2009/07/15(水) 17:07:270633デフォルトの名無しさん
2009/07/15(水) 17:16:05ソケット使うのは入門じゃない
0634デフォルトの名無しさん
2009/07/15(水) 17:19:31ル側は “発射予定日が夏休暇シーズンと重なり, 周辺モーテルにも空室がない”と伝えた。
ナロ号を船上から見ようとする人々で遊覧船予約も終わった。 羅老島(ナロド)近隣で198t級遊覧船ク
ムホ号を運航するコ・ジョンソク船長(57)は “旅行会社を通じて, 搭乗客200人を募集したが3日で予約
が終わった”と話した。
発射当日,推進体落下などにともなう問題で, 宇宙センター近隣陸上と海上の出入りが統制される。 だ
が天気が良ければ半径20km内外でカウントダウンと共に火花を出すナロ号の威容を見られるものとみ
られる。
全南道(チョンナムド)と高興郡(コフングン),麗水市(ヨスシ)は安全問題と障害物有無などを考慮して
ナロ号を肉眼で見られる‘ビューポイント’16ヶ所を選定した。 宇宙センターから遠く離れておらず統制
区域の外ながらも視野がパッと開いたところは, 高興(コフン)が7ヶ所, 麗水(ヨス)が9ヶ所だ。 高興(コ
フン)地域最適地は影南面(ヨンナムミョン)ナムヨル海水浴場。
高興郡(コフングン)はこちらに多くの観覧客が訪れると見て駐車場と特設舞台を作ることにした。 麗水
市(ヨスシ)は宇宙センターから20〜30km離れた華井面(ファジョンミョン)シド, ナンド, サンナファド, ケド,
ペクヤド等9ヶ所を推薦した。 この島々と宇宙センターの間には障害物がなく視野がパッと開いて, 展望
の良いところで選ばれる。
ビューポイント16ヶ所は全南道(チョンナムド)観光ホームページの南の島コリア(www.namdokorea.com)
で見られる。
教育科学技術部は300人以上を抽選して, 海軍独島艦に乗艦させて, ナロ宇宙センター近海からナロ号
発射場面を観覧するイベントも持つ。
歴史的な韓国最初宇宙ロケット発射を控えた高興郡(コフングン)の客応対手助けも忙しい。 高興郡
(コフングン)は30日ナムヨル海水浴場から発射場面生中継とともにミュージカル ガラショー‘宇宙での
跳躍’等祝い公演を準備している。
高興(コフン)=チョン・スンホ記者 [email protected]
0635デフォルトの名無しさん
2009/07/15(水) 17:22:07記事入力 2009-07-15 02:59
“ナロ号発射直接見に行こう” 高興(コフン)は今‘部屋を手に入れる戦争’
■韓国最初宇宙ロケット発射D-15…現地表情
民宿はもちろんテントまで品切れになって
遊覧船予約も3日ぶりに終わり
肉眼観測するビューポイント選定
駐車場-特設舞台新設奔走
30日韓国最初宇宙ロケット‘ナロ号(KSLV-I)’発射を控えて韓半島南の端すそ全南(チョンナム), 高興
郡(コフングン)がうきうきしている。 発射当日を前後して, 峰来面(ポンネミョン),ナロ宇宙センター近隣
宿泊施設予約がほとんど終わって, 時宜外れの‘部屋を手に入れる戦争’も広がっている。 ‘宇宙都市’
高興郡(コフングン)は大韓民国の夢と希望をのせて宇宙へ行くナロ号発射祝い行事準備で忙しい。
ロケットが空へほとばしる場面を肉眼で見られる‘ビューポイント’を選定して発射特需を生かすために
観光商品も作った。
“残った部屋がないです。 民宿はもちろんで海水浴場モンゴル式テントまで….”
全南(チョンナム),高興郡(コフングン),影南面(ヨンナムミョン)ナムヨルリ。 この村はナロ宇宙センター
へ直線距離で15km離れているが, 肉眼で宇宙センター建物が見えるほど展望が良いところだ。
この村のマ・ヨンマン次長(63)は “29日から31日まで部屋を探し当てようとする人々のために大変な苦
労をしているが, それでも気持ちは良い”と笑った。
こちらは夏ならば10世帯余りが民宿を運営する。 先月開場した海水浴場には避暑客のためのモンゴ
ル式テント60棟が設置されている。 民宿とテント予約は先月10日ナロ号発射日が発表されてすぐ皆終
わった。 マ次長は “民宿世帯数を増やしてみるが, 駆せ参じる人々を受け入れるには力不足であるよ
うだ”と耳打ちした。 ナロ宇宙センターまで乗用車で40分の距離のトファミョン・パルポ海水浴場近隣ビ
0636デフォルトの名無しさん
2009/07/16(木) 20:06:35ダブルバッファリング
0637282
2009/07/16(木) 20:24:33ありがとうございます。そう思いますよね。n=入力サイズと解釈しました。
では、なぜBase62だとO(n)の空間が必要な理由は分かります?
考えたのですが、私は2^x = 62を満たすxが無理数となるからだと思いました。
一方、入力サイズから出力サイズを決めるためには有理数でなければならないかと。
(O(1)を実現させるためには、上記制約が必要だと考えています)
(>>627の「桁上げ」とは四則演算する「過程」で必要な一時バッファですよね?
「過程」ではなく「結果」を格納するバッファが欲しいのです)
あと、何をイメージして、>>631となってしまうと考えたのでしょうか?
Base64や、>>448のような近似値でやってしまう場合の制限であって、
他の方法をとればこの制限はなくなる可能性があるかなと思ったんです。
(コードの偏りによる圧縮などは除く)
この点については「ない」というのであれば「な(略
O(n^2)の時間がかかる部分について、どの処理でO(n^2)になってしまうかについて、
割る処理と余りを求める処理の2つをイメージしましたが、認識合いますでしょ
うか?
O(n^2)の内訳は、割る回数がO(n)で、1回の割る処理にかかる時間がO(n)だか
ら、合わせてO(n^2)だと考えています。
C言語から離れてきましたが、やりたいことはBase62で妥当なコードと
エンコード後のサイズを必要最小限としたいだけでしたが、
「妥当なコード」「必要最小限」を理詰めで説明出来そうな状態となったため、
ほぼ問題は解決しました。
スレッドストッパーになったようで、すみません
0638デフォルトの名無しさん
2009/07/17(金) 00:44:23通常、ASCIIテキスト文字列+\0 を渡すと文字列が表示されますが、
ここにバイナリ(非ASCII文字列)が来るかもしれない場合でも
とにかくそのまま渡してしまうのは問題ないでしょうか?
それとも危険な事がありますか?
例えば printf が落ちるみたいな。
0639デフォルトの名無しさん
2009/07/17(金) 00:55:020640デフォルトの名無しさん
2009/07/17(金) 00:56:49その「バイナリ」の種類によります。ナル文字(=値0のバイト)が出現しない場合、バッファオーバーランしかねません。
逆に、途中にナル文字が出現するとその先は出力されないことになります。
非表示文字による問題が出るかどうかは、端末エミュレータの仕様次第です。
よく知られているところでは、ベル文字(=値7のバイト)が連続すると、ビープ音が鳴り続けるだけでなくその間
表示も動かず入力も行なえないなんて状況になったりもします。
しかし、リダイレクトでファイルに出力するような応用では殆ど危険がないとも言えます。
尚、バッファオーバーランを防ぐには、"%.20s"のように予め制限するか、"%.*s"のように出力バイト数を
引き数で渡す方法があります。
0641638
2009/07/17(金) 01:02:16ありがとうございました。
0643デフォルトの名無しさん
2009/07/17(金) 09:37:470644デフォルトの名無しさん
2009/07/17(金) 09:38:470645デフォルトの名無しさん
2009/07/17(金) 10:35:430646デフォルトの名無しさん
2009/07/17(金) 10:38:080647デフォルトの名無しさん
2009/07/17(金) 10:38:51論理的思考で進めないといけないプログラムの世界で爆発とか抽象的な意味不明なこというな
長年連れ添った夫婦間で交わされるあれとかこれで通用する話じゃねーよ
0648デフォルトの名無しさん
2009/07/17(金) 10:42:37かっこよす
0649デフォルトの名無しさん
2009/07/17(金) 10:47:170650デフォルトの名無しさん
2009/07/17(金) 11:44:240651デフォルトの名無しさん
2009/07/17(金) 13:11:560652デフォルトの名無しさん
2009/07/17(金) 13:13:32それは甘い
どうやってもすることがあるから仕舞いにはマネージドなんてのができるんだよ
0653デフォルトの名無しさん
2009/07/17(金) 13:15:50/ : : : : : : : : : : : \
/: : /  ̄ ̄ ̄ 、 : i だんねんながら
!: : l l: : ! ニーブにぎゅういちは
l: : :! 一 ー !: :.l 発毛の効果を100パーネント
/: : !_ィェァュ ii ィァュ_ }: :ヽ 実証するものではございまねん
-―-、 ! Y Y /
‐ ー、 / ,ー ― 、i ヽl ! 、_ , ! !/
ハ \ ! i ニ ニ l ! ! / ィ===ュヽ ノ /⌒ヽ、
\ ヽ ヽト _ ィ \! ヽェェェ イ ! イ/  ̄⌒ヽ _ l/ ⌒ ‐-、
- ヽ } i i′ _.イ i\ _/ノi\ i / 人 ___ ヽ
,= !│ /ヽ_,. .ー' ̄/:.:.:.i \  ̄´ / |:.:.:ヽー 、__!, ! / __ ` 、
!丿厶 ー:.:.:.:.:.:.:.:./:.:.:.:.:.:ヽ / ‐ く /:.:.:.:.:.\:.:.:.:.:.:.ヽ| ェュ ィァ i
‐- ノ {:.:.\:.:.:.:.:.:.:.:.:.:.\:.:.:.:.:.:.:V 、 人 l:.:.:.:.:.:.<´:.:.:.:.:.:.:.:.:.:.ヽ || !
_/ | i|:.:.:.:.:.i:.:.:.:.:.:.:.:.:.:./:.:.:.:.:.:.:.i /~ヽ !:.:.:.:.:.:.:.:\:.:.:.:.:.:.:.:.:.:∧=- イ
/ |:.:.:.:.:.:.:l:.:.:.:.:.:.:.:.:ヽ:.:.:.:.:.:.:.:.:l/ ∨:.:.:.:.:.:.:.:.:./:.:.:.:.:.:.:.:.:/:..:i __/ l
0654デフォルトの名無しさん
2009/07/17(金) 14:33:48爆発であってるんじゃない?
0655デフォルトの名無しさん
2009/07/17(金) 14:55:52いやだからお前の主観なんかどうでもいいから。
0656デフォルトの名無しさん
2009/07/17(金) 15:17:50long hash(char *s);
int com(char *s);
char str[10];
long h[15],c[15];
みたいなプロトタイプ宣言?と変数宣言があって、その後のほうでstr[0-9]に文字列が入れてあって、その後で
while(search(str)==0){
h[i]=hash(str);
c[i]=comcount(str);
i++;
以下略、という処理があるんですが、
このsearch(str)==0とかh[i]=hash(str)とかは何が起きますか?
どこにも関数の処理の中身が無いのですが。
0657デフォルトの名無しさん
2009/07/17(金) 15:18:52「機械の調子が悪い」って意味で「爆発」を使う。
例
「うちのビデオデッキが爆発した」
0658デフォルトの名無しさん
2009/07/17(金) 15:21:21ここはよろず相談所じゃないので、一つ一つ細切れで質問するのなら全部のソースを提示しなさい。
それはさておき、search(str)もhash(str)も関数を呼んでいるわけだからその内部の記述はどこかにあるのだろ。
0659デフォルトの名無しさん
2009/07/17(金) 15:36:17>このsearch(str)==0とかh[i]=hash(str)とかは何が起きますか?
リンク時にライブラリから検索され、そちらが呼び出されます。
0660デフォルトの名無しさん
2009/07/17(金) 15:44:00別のファイルに中身が書いてあるんじゃないか
0661デフォルトの名無しさん
2009/07/17(金) 15:45:070662デフォルトの名無しさん
2009/07/17(金) 16:14:460663デフォルトの名無しさん
2009/07/17(金) 16:19:40本体ファイルのmain関数が終わった後にあるはずだとばかり思ってました。
0664デフォルトの名無しさん
2009/07/17(金) 20:19:30どこもかしこも中途半端なサンプルばっかで嫌になる
おまけにタイプミスしまくりだし
ちゃんと一発でコンパイルできるソース載せとけよ
そっからコピペすれば単純ミスもなくなるだろうに
0665デフォルトの名無しさん
2009/07/17(金) 20:21:18NUL がでるまでだらだらとバイナリーがコンソール出力されるだけでは?無論表示は支離滅裂だけれども。
0666デフォルトの名無しさん
2009/07/17(金) 20:22:50サンプルに文句言うなよ
0667デフォルトの名無しさん
2009/07/17(金) 20:23:330668デフォルトの名無しさん
2009/07/17(金) 20:26:12どこの流派なんだろう?
全員が意図的にやってるとは思えないんで、何も考えずにコピペした結果なんだろうけど。
0669デフォルトの名無しさん
2009/07/17(金) 21:07:010670デフォルトの名無しさん
2009/07/17(金) 21:48:04こうすると、タブのカラム数が何カラムの環境であろうと、インデントのカラム数は変わらない。
0671デフォルトの名無しさん
2009/07/17(金) 21:49:490672デフォルトの名無しさん
2009/07/17(金) 22:23:390673デフォルトの名無しさん
2009/07/17(金) 22:36:10もちろん嘘だからな!
0674デフォルトの名無しさん
2009/07/17(金) 22:52:210675デフォルトの名無しさん
2009/07/18(土) 01:08:260676デフォルトの名無しさん
2009/07/18(土) 01:24:02int **x;
この時点で各要素数は未定です。
こいつのアドレスを関数【void read_file(?)】に渡して
その関数内で要素数(m*n)を決定後、mallocでメモリを割り当てて
データを挿入します。
この関数がリターンしてもアドレスを渡していた訳だから
main関数内のxにはデータが挿入されてます。
っていうのプログラムを作ってるんですが
関数read_file()の引数をどう宣言して
xをどう渡していいのか分かりません。
あくまでリターン無しのやり方でお願いします。
0677デフォルトの名無しさん
2009/07/18(土) 01:27:32read_file(&x);
0678676
2009/07/18(土) 01:46:14しょっぱなにそれを試しましたがムリでした。
int x[2][2]
を関数に渡す場合は
void read_file(int x[][2])
もしくは
void read_file(int (*x)[2])
とすればいいみたいに書かれてました。
要するに省略できるのは要素の一番左の部分だけ。
これだと要素未確定の2次元配列を渡せないので質問しました。
0679デフォルトの名無しさん
2009/07/18(土) 02:04:54それ配列ちゃう
0680デフォルトの名無しさん
2009/07/18(土) 02:09:13x = (int*)malloc(sizeof(int)*m*n);
それともこうやってる?
x = (int**)malloc(sizeof(int*)*m);
for(i=0;i<m;i++)
x[i] = (int*)malloc(sizeof(int)*n);
0681デフォルトの名無しさん
2009/07/18(土) 02:35:36その下の方法しかないよなあ
>>676
C言語ではサイズ不確定の2次元配列は扱えないから、「配列の配列」形式にする
まあ見た目はいっしょだから気にしない方向で…
#include <stdio.h>
void read_file(int ***px, int *pm, int *pn)
{
int i, j;
int m=5, n=4; /* 関数内でmとnの値が確定する */
int **p = (int **)malloc(sizeof(int *) * m);
for (i = 0; i < m; ++i) {
p[i] = (int *)malloc(sizeof(int) * n);
for (j = 0; j < n; ++j) { p[i][j] = i * n + j; }
}
*px = p; *pm = m; *pn = n; /* xに加えてmとnの値もmain()に戻してやる */
}
int main()
{
int **x, m, n, i, j;
read_file(&x, &m, &n);
for (i=0; i<m; i++) { for (j=0; j<n; j++) { printf("x[%d][%d]==%d\n", i,j,x[i][j]); } }
return 0;
}
0682デフォルトの名無しさん
2009/07/18(土) 02:45:33ちょっと趣旨違うけどここ読んでそう思った
http://book.geocities.jp/muu5muu/doc1/sample7.html
0683デフォルトの名無しさん
2009/07/18(土) 02:57:01そのリンク先のどのへんでそう思ったんだろう
0684デフォルトの名無しさん
2009/07/18(土) 04:23:210685デフォルトの名無しさん
2009/07/18(土) 04:47:58メモリの確保は一発でやろうよ。
--
int ** alloc2d(unsigned width, unsigned height)
{
const unsigned fieldSize = sizeof(int) * width * height;
const unsigned arraySize = sizeof(int *) * height;
int ** rtn = malloc(arraySize + fieldSize);
int * field = (int *) & rtn[height];
for (unsigned ic = 0; ic < height; ++ic) {
rtn[ic] = & field[ic * width];
}
return rtn;
}
--
0686デフォルトの名無しさん
2009/07/18(土) 08:59:34unsigned 型ってずいぶん久しぶりに見たよ
K&R Cからやってる人なのかな
0687デフォルトの名無しさん
2009/07/18(土) 10:38:43ほんとろくでもないなw
0688デフォルトの名無しさん
2009/07/18(土) 11:15:08引き数のunsigned intは負の数を与えられるリスクを避けられる。上限チェックはするべきだけど。
サイズ保持のunsigned intはsize_tを使うべきかも知れないが、パフォーマンスを気にしたのかもしれない。
ループカウンタのunsigned intは上限値との比較で警告が出るのを回避する効果くらいしかない。
結論:>685は中途半端w
0689デフォルトの名無しさん
2009/07/18(土) 11:24:11俺も久しぶりだわ。
0690デフォルトの名無しさん
2009/07/18(土) 11:28:420691デフォルトの名無しさん
2009/07/18(土) 13:30:500692デフォルトの名無しさん
2009/07/18(土) 13:49:11size_tだとマイナスの値でも確保しちゃうかもしれない
0693デフォルトの名無しさん
2009/07/18(土) 13:51:020694デフォルトの名無しさん
2009/07/18(土) 13:51:560695デフォルトの名無しさん
2009/07/18(土) 13:53:09for 文回すときも
0696デフォルトの名無しさん
2009/07/18(土) 14:03:49入力された文字列を逆の順で表示するプログラムをつくりたいのですがうまくいきません
解答をみたら簡潔な答えがのってあって理解できたのですが、なぜこれではうまくいかないのでしょうか?
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[80],str2[80];
int a,b;
a =0;
printf("文字を入力してください(80文字未満)\n");
gets(str1);
b = strlen(str1);
str2[b] = '\0';
for(;str1[a];a++)
strcpy(str2[b-1],str1[a]);
/* もしくは str2[b-1] = str1[a]; */
printf(str2);
return 0;
}
0697デフォルトの名無しさん
2009/07/18(土) 14:08:08strcpy()は何をする関数なのか、よく考えてみよう。
0698デフォルトの名無しさん
2009/07/18(土) 14:09:37取り敢えず初心者なら、forは必ず{}で囲む習慣をつけましょう。
で、bの値はstrlen()の結果を入れた後ずっと変わらないよね。
それでいいのかな?w
0699デフォルトの名無しさん
2009/07/18(土) 14:11:59どうでもいい。
囲んでない人は、上級者になったから囲まなくなったってわけじゃないし。
0700696
2009/07/18(土) 14:12:26for(; str1[a] ; a++ && b++)
でおねがいします
0701デフォルトの名無しさん
2009/07/18(土) 14:14:32独習Cにソースの内容をターゲットにコピーするとかいてありました・・・
>>698
すいません。forの後にタブいれといたんですが消えたみたいです
0702デフォルトの名無しさん
2009/07/18(土) 14:17:01for(; str1[a] ; a++, b--)
str2[b-1] = tr1[a];
0703デフォルトの名無しさん
2009/07/18(土) 14:25:02ありがとうございます!ちゃんと動きました
でもまだなぜstrcpyが駄目なのかちょっとわからないです・・・
0704デフォルトの名無しさん
2009/07/18(土) 14:29:18str → string → 文字列 → (末尾に'\0'の格納された)char配列
strcpy → string copy → 文字列のコピー → char配列のコピー
char をコピーしたいんであって、char配列をコピーしたいわけじゃなかろ。
っていうか、教科書にstrcpyの実装書いてあったじゃろ。普通なら。
0705デフォルトの名無しさん
2009/07/18(土) 14:34:26strcpy(&str2[b-1],&str1[a]);
は、
for(;str1[a]; a++, b++){
str2[b-1] = str1[a];
}
と同じだから。
0706デフォルトの名無しさん
2009/07/18(土) 14:35:12それがターゲット、ソースとしかかかれてなくて・・・
要するに文字列をコピーする関数だから配列の中身ひとつひとつをコピーすることはできないってことでいいでしょうか?
0707デフォルトの名無しさん
2009/07/18(土) 14:36:58#include <stdio.h>
void rvs(char *p) {
if(*p) {
rvs(p+1);
putc(*p, stdout);
}
}
int main(void) {
char str[] = "123abc";
rvs(str);
return 0;
}
0708696
2009/07/18(土) 14:39:35> strcpy(&str2[b-1],&str1[a]);
コンパイルはできましたが正しく動作しませんでした。
あ、インクリメント部で&&ってつかわなくてもコンマで代用できるんでしょうか?今まで
ずっと&&をつかってたんですけど、こっちのほうがうちやすいですね
0709デフォルトの名無しさん
2009/07/18(土) 14:40:310710696
2009/07/18(土) 14:40:34ポインタは次の章から勉強なんでまだわからないです><
ごめんなさい。でもありがとうございます
0711デフォルトの名無しさん
2009/07/18(土) 14:43:34その教科書は古紙回収に出したほうがいいかもw
>文字列をコピーする関数だから配列の中身ひとつひとつをコピーすることはできない
そんな感じ。頭にstrのつく関数は基本的に配列に対して作用します。
0712デフォルトの名無しさん
2009/07/18(土) 15:04:47よくわかりました!どうもありがとうございます
0713デフォルトの名無しさん
2009/07/18(土) 18:04:55>709も書いているけど、&&は,とは意味が全然違うから要注意。
そもそもなんで&&なんて発想が出てきたのかそのほうが興味深い。
0714デフォルトの名無しさん
2009/07/18(土) 18:22:030715デフォルトの名無しさん
2009/07/18(土) 19:16:14__cdeclは可変引数を取れるメリットがあって、Cの標準的な呼出規約ということですが、
自作関数なんか作るときは、Cであっても__stdcallを意識的に付けるほうが速度的には望ましいんでしょうか
アセンブリコード見てたら、引数が決まってる場合には__stdcallの方が良さげですよね
もっとも学校の課題レベルの私 & 今の時代に数バイト単位のコードの違いを気にする必要もないのかもしれませんが
__stdcallのデメリットみたいなものがあったら、教えて頂きたく思います
0716デフォルトの名無しさん
2009/07/18(土) 20:09:33環境依存のキーワードだから、どこでも使えるわけではない。
# __cdeclも同じデメリットを持つけどねw
0717デフォルトの名無しさん
2009/07/18(土) 20:13:30あと、大抵はコンパイラオプションで呼出規約を指定していない関数の呼出規約を選べるので、
そっちで指定するという手もある。そうすると今度はmain関数に__cdeclを指定する羽目になるんだけどね。
0718デフォルトの名無しさん
2009/07/18(土) 20:25:20kouzou.nameにアクセスするときは
kouzou.nameという場所に行くのでしょうか?
それとも
kouzouという構造体の先頭アドレスから
何番目にnameがあるのかわかるからでしょうか?
0719デフォルトの名無しさん
2009/07/18(土) 20:36:570720デフォルトの名無しさん
2009/07/18(土) 20:38:18後者
でもそれを実際にkouzou.nameという名前でアクセスできるんだから
プログラマが「kouzou.nameという場所がある」と認識しても不都合はないと思う
0721デフォルトの名無しさん
2009/07/18(土) 20:46:36つまり、kouzou.nameにアクセスするとき、
実行時に「kouzouのアドレスを取得してnameのオフセットを加算して…」とやってるわけじゃなくて、
コンパイル時にkouzou.nameのアドレスはわかってる
一般の変数をアクセスするのと、kouzou.nameをアクセスするのは、手間としては一緒です
0722718
2009/07/18(土) 21:38:35もし構造体のメンバに
メモリを動的に確保したものがあった場合って
どうするんでしょうか?
これだとコンパイル時にアドレスの場所わかりませんよね?
0723デフォルトの名無しさん
2009/07/18(土) 21:43:040724デフォルトの名無しさん
2009/07/18(土) 21:53:42そりゃまあそのとおりで、構造体メンバがポインタ型なら、間接参照の手間はかかる
この場合は、一般のポインタ型変数と同じと思えばいいかも
たとえば
struct A { int n; char *p; } kouzou;
char *p;
という2つの変数があって、
kouzou.p = malloc(100);
p = malloc(100);
とメモリを割り当ててるとしたら、
kouzou.p[10] = 'A';
p[10] = 'A';
はどっちも同じ手間
0725みならいエスパー
2009/07/18(土) 22:36:17struct A { int n; char *p; int n2; } kouzou;
kouzou.p = malloc(100);
とメモリを割り当てた場合、kouzou先頭からn2までの場所が
変わってしまうと思っているのでは無いだろうか。
0726718
2009/07/18(土) 22:39:44そう思ってしまいましたが
よくよく考えてみると
ポインタにはアドレスしか格納されてないんで
場所はコンパイル時と変わってないんですね
ありがとうございました。
0727デフォルトの名無しさん
2009/07/18(土) 23:19:18qが入ると終了する。どうするの?
0728デフォルトの名無しさん
2009/07/18(土) 23:20:08ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され,
2行目以降はその数の不定長文字列が空白で区切られているような入力ファイルを読み込み,
各行を以下に示す構造体の単方向連結リストに保存するプログラをを作成せよ.
ここでは,attributes が1行分のデータを保持する.
struct t_list {
char **attributes;
struct t_list *next;
};
という課題が出ているのですが、
**atributes がどういうしくみになっているのかがわかりません。
たとえば、入力ファイル中に
abc defg
という一文があったときに、
strtokを使い、" "(←スペース)を区切り記号として分割したとして、
それをどのように attributes にいれていけばよいのでしょうか。
どなたか解説していただけないでしょうか。
0729デフォルトの名無しさん
2009/07/18(土) 23:22:480730デフォルトの名無しさん
2009/07/18(土) 23:23:280731デフォルトの名無しさん
2009/07/18(土) 23:26:540732デフォルトの名無しさん
2009/07/18(土) 23:27:11strtokは紙とペンがないと説明しにくいなー。サンプルコードでいい?
0733デフォルトの名無しさん
2009/07/18(土) 23:31:40ポインターのポインターのことならそう書いたほうがいい
0734デフォルトの名無しさん
2009/07/18(土) 23:32:30だからダブポと聞いたら、「それって日テレ?」と直感するくらいの気持ちでいいのだ。
それを念頭に、ではこれをご覧ください。
int n = 一行目から読み取ったx行目の文字の個数;
char *c[n];
c[0] = "x行目の最初の文字列";
c[1] = "x行目の2番目の文字列";
c[2] = "x行目の3番目の文字列";
c[n-1] = "x行目のn番目の文字列";
char **attributes = c;
構造体にcの長さ、つまりnも格納しておかないと
面白いことになるぞ。
0735デフォルトの名無しさん
2009/07/18(土) 23:37:30ありがとうございます。
ちなみに、
fgetsでファイルを読み込んで、for文でstrtokしています。
for(token=strtok(str, DELIMITER); token!=NULL; token=strtok(NULL, DELIMITER))
strには読み込んだ文字列が入っていて、
char *token;
#define DELIMITER " "
となっています。
しかし理解しているのかと聞かれると、正直理解していません。
今回の質問はstrtokした後に**attributesにどういれるのか、だったのですが、
strtokについても解説していただけると、とっても助かります。
0736デフォルトの名無しさん
2009/07/18(土) 23:50:48ご指摘ありがとうございます。
>>734
なるほど。
1文に2つ以上文字列があった場合は、
どうやって**attributesにいれればいいですか?
(2つ目以降の文字列の処理です。)
2次元配列みたいな考え方でいいのでしょうか。
0737デフォルトの名無しさん
2009/07/18(土) 23:51:50strtokは、新しい文字列領域を自動的に確保(malloc())してくれるわけじゃなくて、
元々あるchar配列(ここではstr)の要所に'\0'を挿入しながら、複数の文字列を作っていくしくみ。
たとえばファイルから読み込む1行が80文字以内だとすれば、
それを分割すると最大40個のトークンができるから、
char *tokens[40];
か、それに相当する動的配列をで用意しておく。
で、strtok()で切り出されてくる文字列の先頭アドレスpをtokens[i++] = p; みたいに入れていく
最後に、
char **attributes
にたいして、
attributes = &tokens[0];
とすれば、1行ぶんの分割が完了。
0738デフォルトの名無しさん
2009/07/19(日) 00:09:09そうか、切り出したトークンの1つ1つのアドレスを
attributesに渡していけばいいんですね。
おおまかな流れはつかむことができたのですが、
いまいちattributesがポインターのポインターである意味が理解できていません。
attributes = &tokens[0];
として、トークンの数が2つ(以上)だったとき、
例えば、先の例に当てはめると、
abc defg
はどのように保存されているのでしょうか。
*attributes[1] = "abc";
*attributes[2] = "defg";
でしょうか?
*attributesは何で、**attributesが何なのかがいまいちわかっていません。
要領が悪くてすみません。
0739デフォルトの名無しさん
2009/07/19(日) 00:10:37*attributes[0] = "abc";
*attributes[1] = "defg";
に訂正してください。
0740デフォルトの名無しさん
2009/07/19(日) 00:16:00attributes[0] = "abc"
attributes[1] = "defg"
0741デフォルトの名無しさん
2009/07/19(日) 00:18:49ポインタへのポインタだから**になる
0742デフォルトの名無しさん
2009/07/19(日) 00:29:07attributes には文字列の先頭、ここでは'a'のアドレスが格納されていて
*attributes にはattributes[0]のアドレスが格納されていて(あれ?)
**attributes とはなんなんでしょう。
ほんとすいません...
0743デフォルトの名無しさん
2009/07/19(日) 00:34:12*c[] って同義ですか?
0744デフォルトの名無しさん
2009/07/19(日) 00:36:30□->■->abc
■->defg
0745デフォルトの名無しさん
2009/07/19(日) 00:39:11**cという「式」は常に*c[0]やc[0][0]と置き換えられるが,逆は成り立たないし,式でない**cも置き換えられない.
0746デフォルトの名無しさん
2009/07/19(日) 00:46:510747デフォルトの名無しさん
2009/07/19(日) 00:48:48一瞬にしてもやもやが晴れました。
>>745
なるほど、ありがとうございます。
ご協力いただいたみなさん、ありがとうございます。
さっそくカタカタやってみます。
0748デフォルトの名無しさん
2009/07/19(日) 00:49:26でもこういうのって、アセンブラをやれば理解できるのかー。いい機会だしアセンブラサイトなんか当たってみます
0749デフォルトの名無しさん
2009/07/19(日) 00:49:590750デフォルトの名無しさん
2009/07/19(日) 00:51:39とおもったら図キター>>744
0751デフォルトの名無しさん
2009/07/19(日) 00:59:050752デフォルトの名無しさん
2009/07/19(日) 01:01:240753デフォルトの名無しさん
2009/07/19(日) 01:02:21アセンブラ知ってないとその辺が想像できない人がいるのよ
ポインタで挫折するってのは有名な話じゃん
俺は逆にC独特の記述で悩んだよww
0754デフォルトの名無しさん
2009/07/19(日) 01:13:240755デフォルトの名無しさん
2009/07/19(日) 01:18:070756デフォルトの名無しさん
2009/07/19(日) 01:19:060757デフォルトの名無しさん
2009/07/19(日) 01:24:030758デフォルトの名無しさん
2009/07/19(日) 01:28:320759デフォルトの名無しさん
2009/07/19(日) 01:30:330760デフォルトの名無しさん
2009/07/19(日) 01:30:420761デフォルトの名無しさん
2009/07/19(日) 01:33:15教える気が無いのならもうこないでくださいね〜^^;
0762デフォルトの名無しさん
2009/07/19(日) 01:36:500763デフォルトの名無しさん
2009/07/19(日) 01:44:440764デフォルトの名無しさん
2009/07/19(日) 01:45:11後、入門篇とか謡っておきながら入門者に冷たすぎるねC厨は・・・
これからCを始めようと思ってる皆さん、親切なJavaスレに行きましょうね
0765デフォルトの名無しさん
2009/07/19(日) 01:50:070766デフォルトの名無しさん
2009/07/19(日) 01:58:130767デフォルトの名無しさん
2009/07/19(日) 02:16:400768デフォルトの名無しさん
2009/07/19(日) 03:48:260769デフォルトの名無しさん
2009/07/19(日) 07:01:29それが良い。
お前みたいなゆとりはJavaでもやってろ。
0770デフォルトの名無しさん
2009/07/19(日) 08:29:44開発環境:VisualC++2008ExpressEdition
テキストファイルを読み込んでExtTextOutで表示する動作についてです
半角英数記号は正常に表示されるのですが
全角文字は文字化けしたり別の文字になってしまいます
例えば「テスト」と表示したいのに「eXq」となってしまいます
テキストから読み込んだ文字列をいったん変数へ代入しておいて
その変数を使用して全角文字を表示するにはどうすればいいですか?
よろしくお願いします
0771デフォルトの名無しさん
2009/07/19(日) 08:55:17ちょっと調べてみたらこんなのがありました
http://oshiete1.watch.impress.co.jp/qa4276173.html
>wchar_tを表示するのなら
>ExtTextOutW( )を使った方がいいと思いますよ
>又は
>LPCTSTR str = _T("Ver***byKKK");
>してマルチバイトでもユニコードでもコンパイルできるようにした方がいいと思います。
だそうです
0772デフォルトの名無しさん
2009/07/19(日) 09:02:340773デフォルトの名無しさん
2009/07/19(日) 09:09:080774デフォルトの名無しさん
2009/07/19(日) 09:21:37これは環境依存しねーだろ
0775デフォルトの名無しさん
2009/07/19(日) 09:45:280776デフォルトの名無しさん
2009/07/19(日) 09:46:050777デフォルトの名無しさん
2009/07/19(日) 09:46:250778デフォルトの名無しさん
2009/07/19(日) 09:49:290779デフォルトの名無しさん
2009/07/19(日) 10:04:02ありがとうございます
wchar_t ss[256];
wcscpy(ss, TEXT("テスト"));
ExtTextOutW(hDC, 0, y, ETO_CLIPPED, NULL, ss, wcslen(ss), NULL);
これなら表示できるのですが
wchar ss[256];
fp=fopen("hoge.txt","r");
fgetws(ss, 256, fp);
ExtTextOut(hDC, 0, y, ETO_CLIPPED, NULL, ss, wcslen(ss), NULL);
これだと文字化けしてしまいます
何が違うのでしょうか?
0780デフォルトの名無しさん
2009/07/19(日) 10:06:31○ ExtTextOut
× wchar ss[256];
○ wchar_t ss[256];
です、すいません
0781デフォルトの名無しさん
2009/07/19(日) 10:20:590782デフォルトの名無しさん
2009/07/19(日) 10:25:04http://hw001.gate01.com/eggplant/tcf/cpp/wchar_t_trap.html
fopenをテキストモードで使わないでバイナリーモードで開いて・・・だと
自分でコードを意識しないとだめか
0783デフォルトの名無しさん
2009/07/19(日) 10:33:39どこに「バイナリモード」云々と書かれているの?
そもそもその記事のどこがCの話?
0784デフォルトの名無しさん
2009/07/19(日) 10:34:20・hoge.txtにはどういう文字がどういう文字コードで格納されてるの?
・文字化けするというパターンでバイナリレベルで文字コードはどうなってるかみてみた?
たぶんこれだけ確認すればおおよその絞込みはできそうなんだが
0785デフォルトの名無しさん
2009/07/19(日) 10:34:53テキストファイルのエンコーディングが適切でないのでしょ。
0786デフォルトの名無しさん
2009/07/19(日) 10:35:01txtの中身は
1行目に「テスト」で改行が1回です
>>782
試しに_wfopenしてみましたが同じでした
0787デフォルトの名無しさん
2009/07/19(日) 10:35:37だから、そのテキストファイルのエンコーディングが何か、が問題。
0788デフォルトの名無しさん
2009/07/19(日) 10:37:27>>してマルチバイトでもユニコードでもコンパイルできるようにした方がいいと思います。
汎用テキストマッピングは無意味だから、ワイド 文字きめうちのほうがいい。
0789デフォルトの名無しさん
2009/07/19(日) 10:41:58お前は他人が出したヒントにあおりいれるだけかよ
setlocale vc++ で検索してみつけたからヒントとしてだしたんだよ
0790デフォルトの名無しさん
2009/07/19(日) 10:43:45Stirlingでtxtを見てみた所
83 65 83 58 83 67 0D 0A テスト..
って表示されてました
0791デフォルトの名無しさん
2009/07/19(日) 10:44:44あんたは他人が出した指摘に逆切れ気味にレスするだけかよ。
C++の話題を書きたいならスレ違いだから指摘したんだよ。
0792デフォルトの名無しさん
2009/07/19(日) 10:45:29INはそれだよね
じゃあ
OUTはどうなの?
ファイルオープンして読み込みが終わった際のコードの状態
0793デフォルトの名無しさん
2009/07/19(日) 10:45:32すいません、書き込んだりバイナリエディタDLして調べてる間に
785さんが書き込んだので飛ばしてしまいました
0794デフォルトの名無しさん
2009/07/19(日) 10:50:45>OUTはどうなの?
>ファイルオープンして読み込みが終わった際のコードの状態
wchar_t ss[256];
fp=fopen("hoge.txt","r");
fgetws(ss, 256, fp);
ExtTextOut(hDC, 0, y, ETO_CLIPPED, NULL, ss, wcslen(ss), NULL);
これの事ですか?
見当違いな事言ってたらすいません
0795デフォルトの名無しさん
2009/07/19(日) 10:53:01それどう見てもShift_JISじゃん。
fgetwsで読むならwchar_tのエンコーディングに合わせろよ
0796デフォルトの名無しさん
2009/07/19(日) 10:54:18>792の言いたいことは、そのssをダンプしろってこった。
つーか、そもそも本当にCの質問なのか?
0797デフォルトの名無しさん
2009/07/19(日) 11:03:39が言ってるように入力完了後のwchar_t ss[256];に格納された文字コードがどうか確認するってこと
テキストなんて所詮は人間が見やすくした物で文字化けしてるしてる言われても
それだけじゃあわからないからw
0799デフォルトの名無しさん
2009/07/19(日) 11:06:20ssのダンプの仕方わからないのでそれも調べてみます
ありがとうございました
0800デフォルトの名無しさん
2009/07/19(日) 11:16:01>796
ついでに言えば、メモリダンプなんてのはデバッグ機能の基本中の基本だ。
VisualStudio使っているなら、fgetws()の次に実行されるコードにブレーク張ればいいだろ。
# 勿論、その詳細もスレ違い。
0802デフォルトの名無しさん
2009/07/19(日) 13:22:14100以下の整数を入力し80以上なら”優”、70以上80未満なら“良”、60以上70未満なら“可”、60未満なら“不可”と表示する。tenに格納された値が不なら終了する。
条件:scanfの前にprintf(”点数を入力してください”);を入れる。whileを使いマイナスの値が入力された場合終了し、100〜0の場合ループさせる。ifを使う
0803デフォルトの名無しさん
2009/07/19(日) 13:24:25どうぞこちらへ
0804デフォルトの名無しさん
2009/07/19(日) 13:24:250805デフォルトの名無しさん
2009/07/19(日) 13:25:07C/C++の宿題片付けます 129代目
http://pc12.2ch.net/test/read.cgi/tech/1247438792/
0806デフォルトの名無しさん
2009/07/19(日) 13:25:11宿題は宿題スレにどうぞ。
0807デフォルトの名無しさん
2009/07/19(日) 13:30:42それは違うだろ。fgetwsのようなワイド文字入出力って文字コード変換するんだぜ。
初期状態だとC localeだから、ASCII文字しか変換しない。
そこで、予めsetlocale(LC_ALL, "");を呼んでおく。
すると、適当な文字コード(日本語WindowsならShift_JIS)での変換が行われるようになる。
0808デフォルトの名無しさん
2009/07/19(日) 13:45:44スレチなのわかってるから調べに行ったんだろ
最後の1行いらんと思うが
0809デフォルトの名無しさん
2009/07/19(日) 14:52:04もしかしたら日本語でおkとか言われるかもしれませんがよろしくお願いします
例えば、main関数で数値を入力して関数○○に渡して計算しなさい、計算結果は関数側で表示する
こういう問題があったとしたら、この関数側とはどういう意味ですかmain関数のことですか?○○関数のことですか?
0810デフォルトの名無しさん
2009/07/19(日) 14:54:14それは問題だした教師に言ってやるべきだなw>日本語でおk
まあきっと、○○関数のほうで表示しろという意味
0811デフォルトの名無しさん
2009/07/19(日) 14:54:31mainじゃない関数です。
つまり計算+表示を担当する関数を作れってことですね
0812デフォルトの名無しさん
2009/07/19(日) 14:57:040814デフォルトの名無しさん
2009/07/19(日) 15:08:52宿題スレへいけ
0815デフォルトの名無しさん
2009/07/19(日) 15:10:12可読性のないコードkwsk
興味ある
0816デフォルトの名無しさん
2009/07/19(日) 15:11:160817デフォルトの名無しさん
2009/07/19(日) 15:19:15_T("文字列")と書いておけば、TCHARと同じで
自動的にchar配列かwchar_t配列に変換されてくれるのね。
これは知らなかったよ。
0818デフォルトの名無しさん
2009/07/19(日) 15:20:230819デフォルトの名無しさん
2009/07/19(日) 15:22:27#ifdef _UNICODE
#define _T(s) L ## s
#else
#define _T(s) s
#endif
「##ってこういうときに使えるのか」と感心した。
0820デフォルトの名無しさん
2009/07/19(日) 15:24:06表示される段階の文字が化けてる化けてるとか言われても所詮は人間に都合のいい情報なだけで
どう化けてるかなんてコードレベルでみないとわからねえし
0821デフォルトの名無しさん
2009/07/19(日) 15:39:26をいw
0822デフォルトの名無しさん
2009/07/19(日) 15:43:20そんな事わかるやつがこのスレで質問するとは思えんが
「俺はできる」って自己主張したいんですかそうですか
0823デフォルトの名無しさん
2009/07/19(日) 15:45:16手順を噛み砕いて説明したじゃん
0825デフォルトの名無しさん
2009/07/19(日) 17:42:42トラブルのもとだけどな。
0826デフォルトの名無しさん
2009/07/19(日) 17:45:170827デフォルトの名無しさん
2009/07/19(日) 17:51:17自分でファイルをバイナリモードで読み込んでどういうコードか判断するしかないんじゃね?
0828デフォルトの名無しさん
2009/07/19(日) 18:11:01と
char str[256];
の違いについて質問があります
str[256]は256文字以上あふれるとバッファオーバーフローの危険性があると思うのですが、
char *str;
の方は無限に文字を入れることができるということでしょうか?
strcpyなどで何文字を代入してもPCメモリが存在するだけ文字が入っていくのでしょうか?
回答よろしくお願いします。
0829デフォルトの名無しさん
2009/07/19(日) 18:12:24それどころか*のほうは明示的にメモリを確保しないと1バイト分もありません
残念でしたね
0830デフォルトの名無しさん
2009/07/19(日) 18:13:31ポインタの指す先が256以上確保されてなかったら、やっぱ256であふれる。
0831デフォルトの名無しさん
2009/07/19(日) 18:16:23確保したとしても、その制限とPCメモリのサイズには何ら関係がない
0832デフォルトの名無しさん
2009/07/19(日) 18:20:39char *str;
は char c とかがあった時、cのアドレス = &c を格納できるだけの領域しか持ってない。
char ary[256] とかがあった時、先頭のアドレス ary (= &ary[0]) を持ったりするのに使う。
文字列リテラル "hogehoge" なんかは宣言したときその文字列がメモリに確保されるが、
その先頭アドレスを保持して参照したりできるように char *str = "hogehoge"; とかってする。
char *str はただの char型アドレス を保持できるだけの領域(32bit環境なら32bits=4bytes)しか持っておらず、
n文字確保したいときは malloc() などでメモリ上に領域を確保して、その先頭アドレスを *str に保持して使う。
char *str;
scanf("%s", str);
とかいうコードはバッファオーバーフローっていうか str の指す先が不定で落ちる可能性が高い
0833デフォルトの名無しさん
2009/07/19(日) 18:27:55□を1バイトとするとまあ最近のCPUだと
char *str;
は
□□□□
char str[256];
は
□□□□・・・・□□□□と256個確保されます。
テキストしか使えないので
char *str;
の
を■一つでたとえた場合は
■->
という状態ができただけで矢印の先は不定です。
malloc(sizeof(char)*256);
とすると
□□□□・・・・□□□□と256個確保されます。
この確保した256分の先頭アドレスを
■の中に入れてあげると
■->□□□□・・・・□□□□
という形になります。
0834デフォルトの名無しさん
2009/07/19(日) 18:30:050835デフォルトの名無しさん
2009/07/19(日) 18:36:020836デフォルトの名無しさん
2009/07/19(日) 18:38:190837デフォルトの名無しさん
2009/07/19(日) 18:46:200838デフォルトの名無しさん
2009/07/19(日) 18:49:440839デフォルトの名無しさん
2009/07/19(日) 20:14:28つ[atexit()]
0840デフォルトの名無しさん
2009/07/19(日) 20:42:300841デフォルトの名無しさん
2009/07/19(日) 21:02:06ってプロになったらあるんですか?
どんなときでしょうか?
0842デフォルトの名無しさん
2009/07/19(日) 21:02:340843デフォルトの名無しさん
2009/07/19(日) 22:32:380844デフォルトの名無しさん
2009/07/20(月) 09:39:590845デフォルトの名無しさん
2009/07/20(月) 09:45:180846デフォルトの名無しさん
2009/07/20(月) 10:32:280847デフォルトの名無しさん
2009/07/20(月) 15:52:36#ifndef HOGE
#define HOGE
#endif
結局どっちがいいの?
0848デフォルトの名無しさん
2009/07/20(月) 15:57:51他コンパイラにも対応させようと思ったら#ifndef
0849デフォルトの名無しさん
2009/07/20(月) 16:07:260850デフォルトの名無しさん
2009/07/20(月) 16:17:260851デフォルトの名無しさん
2009/07/20(月) 17:39:19# endif
とかのおまじないはなんなんでしょうか?
0852デフォルトの名無しさん
2009/07/20(月) 17:46:05最初はおまじないだと思ってください。
0853デフォルトの名無しさん
2009/07/20(月) 17:48:130854デフォルトの名無しさん
2009/07/20(月) 18:06:31strncmp(buff,"cd\b",3)
だと駄目なのですがこれはどう直せばいいのでしょうか?
0855デフォルトの名無しさん
2009/07/20(月) 18:13:36小文字の場合は
0x63,0x64,0x08
大文字の場合は
0x43,0x44,0x08
という比較用データを容易して比べるといいかも?
0856デフォルトの名無しさん
2009/07/20(月) 18:15:5110000
20000
30000
それを上書き保存モードで開き、
2行目に"40000"をfprintfで出力し、
結果的に20000を消し、40000にする
やり方がありましたら教えてください。
fseekで2行目に動かしても(ftellで7の状態)、
4行目に40000が出力される形になります。
0857デフォルトの名無しさん
2009/07/20(月) 18:18:060858デフォルトの名無しさん
2009/07/20(月) 18:29:23"r+" でオープンしてる?
0860デフォルトの名無しさん
2009/07/21(火) 00:30:30memcmpはchar型しかできないようなので。自分で関数を作るしかないのでしょうか。
0861デフォルトの名無しさん
2009/07/21(火) 00:37:460862デフォルトの名無しさん
2009/07/21(火) 00:38:00いいんじゃないかな。
「int に未使用ビットが存在し、バイト配列として比較すると一致する保証がない」
ような変てこりんなシステムだとそうもいかないだろうけど。
0863デフォルトの名無しさん
2009/07/21(火) 00:51:370864デフォルトの名無しさん
2009/07/21(火) 01:07:25ありがとうございます。void型だとどんな型でも代入できるんですね。もう一度試してみたらうまく出来ました。
・・どこが違ったんだろう(;´∀`)
0865デフォルトの名無しさん
2009/07/21(火) 01:10:32単にキャストしてなかっただけとか?
0866デフォルトの名無しさん
2009/07/21(火) 09:57:12うまくできたって、コンパイル通っただけじゃないよね。テストもしたよね。
0867デフォルトの名無しさん
2009/07/21(火) 10:44:31memcmp()を使うのにキャストが必要だと?
>>860
無理にmemcmp()を使うよりも自前で比較ループを書いた方が最適化が利くかもよ。
0868デフォルトの名無しさん
2009/07/21(火) 12:28:23| 1 2 3
--------
1 | 1 2 3
2 | 2 4 6
3 | 3 6 9
柴田望洋『新版明解C言語入門編』のP78演習4-15で、上記のような形の
九九表を作る問題があるのですが、九九表の上部にあたる
| 1 2 3
--------
の部分をうまく表示させることができなかったため、無理やり次のように
書いてしまいました。
int tate, yoko;
puts("九九の表を表示する。\n");
puts(" | 1 2 3 4 5 6 7 8 9\n-------------------------------");
for (tate = 1; tate <= 9; tate++) {
printf(" %d | ", tate);
for (yoko = 1; yoko <= 9; yoko++) {
printf("%2d ", tate * yoko);
}
puts("\n");
}
もっとすっきりした書き方を考えたのですが、思いつきませんでした。
どのように修正するべきでしょうか。
0869デフォルトの名無しさん
2009/07/21(火) 12:39:40for (yoko = 1; yoko <= 9; yoko++) {
printf("%2d ", yoko);
}
printf("\n");
for (yoko = 0; yoko <= 9; yoko++) {
printf("---", yoko);
}
printf("\n");
みたいにすればいいけど(幅とかは調整必要)、多分>>868の方法が一番単純。
0870デフォルトの名無しさん
2009/07/21(火) 12:52:49サイズが9×9で決め打ちなら、それで十分でしょ。
もし物足りないんだったら、サイズが変えられるように
void print_table(int size)
{
/* 表を描く処理 */
}
みたいな関数を作ってみるといいんじゃない
あとputs()を使うと自動改行でかえってわかりにくくなるので
全部printf()にしたほうがいいとは思う。
0871デフォルトの名無しさん
2009/07/21(火) 12:56:21printf(" | 1 2 3 4 5 6 7 8 9\n"
"-+-----------------------------\n");
と書こう。
# 勿論インデントも揃えると。
0872デフォルトの名無しさん
2009/07/21(火) 13:03:49ありがとうございました。
もし表の計算範囲を変える場合には、>>869さんが
書いて下さった方法がわかりやすいですね。
参考にさせていただきたいと思います。
0873869
2009/07/21(火) 13:13:00ご指摘ありがとうございました。
まだ関数の部分まではテキストを読んでいないため、
そこまで進んだときに改めて考えてみようと思います。
それから、たしかにputs()は不適切でした。修正します。
>>871
ありがとうございます。
2段に分けて記述する方法がわからなかったため、
読みづらい書き方をしてしまいました。それぞれを
""で囲むことで分割できるということですね。
これからは注意していきます。
0875デフォルトの名無しさん
2009/07/21(火) 17:13:17Basic言語で記述されたソフトウェアの処理効率を上げるため
[ ]レベルで書き直すことにしました。
[ ]内に当てはまる言葉を入れよ。
答えは
http://schiphol.2ch.net/test/read.cgi/gameurawaza/1247667748/303
0876デフォルトの名無しさん
2009/07/21(火) 17:46:24sprintfでフォーマット作ってprintfとかするしかないかな
0877デフォルトの名無しさん
2009/07/21(火) 17:53:56*
0878デフォルトの名無しさん
2009/07/21(火) 17:55:46文の格納に必要なバイト数をJISコードの場合とシフトJISコードの場合のそれぞれで計算する問題なのですが、これはどうやって考えれば良いのですか?
漢字、カタカナ、英数字(半角)、記号で構成されている文です
曖昧な質問で申し訳ないのですが、ここでは課題の文を晒せないので、よろしくお願いします><
0879デフォルトの名無しさん
2009/07/21(火) 18:02:10JISやシフトJISの仕様を見て、1文字ずつ判定してくんじゃないかなあ・・・
0880デフォルトの名無しさん
2009/07/21(火) 18:03:28宿題なら宿題スレに、そうでないなら文字コードの問題なので文字コードスレに。
0881デフォルトの名無しさん
2009/07/21(火) 18:15:190882デフォルトの名無しさん
2009/07/21(火) 22:57:43Cって難しいですかね?
0883デフォルトの名無しさん
2009/07/21(火) 23:04:36うん。難しいよ。
0884デフォルトの名無しさん
2009/07/21(火) 23:14:52begin -> {、end -> }、:= -> =
これであなたもC使い
0885デフォルトの名無しさん
2009/07/21(火) 23:17:41はじめにポインタ(->)を使った言語はなんだろう?PL/1かな?
0886デフォルトの名無しさん
2009/07/21(火) 23:33:39日本のメーカーはPL/1をまねてSPLという言語を作って、それで独自のOSを開発していた。
インテルが作ったPL/Mというのもあった。
みーんなCに置き換わっちゃった。
0887デフォルトの名無しさん
2009/07/22(水) 00:37:22/ : : : : : : : : : : : \
/: : /  ̄ ̄ ̄ 、 : i だんねんながら
!: : l l: : ! ニーブにぎゅういちは
l: : :! 一 ー !: :.l 発毛の効果を100パーネント
/: : !_ィェァュ ii ィァュ_ }: :ヽ 実証するものではございまねん
-―-、 ! Y Y /
‐ ー、 / ,ー ― 、i ヽl ! 、_ , ! !/
ハ \ ! i ニ ニ l ! ! / ィ===ュヽ ノ /⌒ヽ、
\ ヽ ヽト _ ィ \! ヽェェェ イ ! イ/  ̄⌒ヽ _ l/ ⌒ ‐-、
- ヽ } i i′ _.イ i\ _/ノi\ i / 人 ___ ヽ
,= !│ /ヽ_,. .ー' ̄/:.:.:.i \  ̄´ / |:.:.:ヽー 、__!, ! / __ ` 、
!丿厶 ー:.:.:.:.:.:.:.:./:.:.:.:.:.:ヽ / ‐ く /:.:.:.:.:.\:.:.:.:.:.:.ヽ| ェュ ィァ i
‐- ノ {:.:.\:.:.:.:.:.:.:.:.:.:.\:.:.:.:.:.:.:V 、 人 l:.:.:.:.:.:.<´:.:.:.:.:.:.:.:.:.:.ヽ || !
_/ | i|:.:.:.:.:.i:.:.:.:.:.:.:.:.:.:./:.:.:.:.:.:.:.i /~ヽ !:.:.:.:.:.:.:.:\:.:.:.:.:.:.:.:.:.:∧=- イ
/ |:.:.:.:.:.:.:l:.:.:.:.:.:.:.:.:ヽ:.:.:.:.:.:.:.:.:l/ ∨:.:.:.:.:.:.:.:.:./:.:.:.:.:.:.:.:.:/:..:i __/ l
0888デフォルトの名無しさん
2009/07/22(水) 01:12:40一応抽象化されたアドレスならアセンブラのマクロ
参照という意味ならLISP
低水準高級言語という意味ならBCPL
0889デフォルトの名無しさん
2009/07/22(水) 11:46:16*str[0]="ぱぽい";
*str[1]="greeeen";
*str[2]="ガッ↓";
ってやると
自動的に
**strにはchar型へのポインタの要領*3
*str[0]には6byte
*str[1]には8byte
*str[2]には3byte
って感じで割り振ってくれるんでしょうか?
0890デフォルトの名無しさん
2009/07/22(水) 11:51:160891デフォルトの名無しさん
2009/07/22(水) 11:56:14こうすればOKです。
0892デフォルトの名無しさん
2009/07/22(水) 11:58:44には8byte
には3byte
あと文字数の認識もおかしい
0893デフォルトの名無しさん
2009/07/22(水) 12:09:18ありがとうございます
>>892
1文字2バイト
小文字1バイト
だと思ってました
0894デフォルトの名無しさん
2009/07/22(水) 12:21:49C言語では文字列の最後に、終端文字というものがつきます。
0895デフォルトの名無しさん
2009/07/22(水) 12:31:36*mem=malloc(sizeof(int)*10); ×
mem=malloc(sizeof(int)*10); ○
int mem=malloc(sizeof(int*10); ×
宣言のときはできたとに
普通にやるとできなくなったりするのですが
なぜこういうことがおきるのでしょうか?
0896デフォルトの名無しさん
2009/07/22(水) 12:35:46これを分解すると
int *mem;
mem = malloc(sizeof(int)*10);
とも書けます。
>*mem=malloc(sizeof(int)*10); ×
>mem=malloc(sizeof(int)*10); ○
>int mem=malloc(sizeof(int*10); ×
これはint型の変数memにポインタを入れようとしてるので駄目です。
ちなみに
>int *mem;
は
int* mem;
とも書けます。
int*はint型のポインタですよということです。
0897デフォルトの名無しさん
2009/07/22(水) 12:46:33int *mem;
とすると、int型の *mem という名前の変数を定義したことになる。
Cでは、変数名の最初が*で始まる場合、その*を取り除くとポインタを取り出すことが出来る
というルールがある。
別の考え方として
int *mem;
とした場合、int型の *mem と、intへのポインタ型の mem の二つが定義されると考えても
いいかもしれない。
0898デフォルトの名無しさん
2009/07/22(水) 12:49:480899デフォルトの名無しさん
2009/07/22(水) 13:03:54int* mem;
int *mem;
どっちも書けるしコンパイルも通るよな・・・
後者で解説してるサイトが多いけど、イメージとしては前者の方がわかりやすいんが
0900デフォルトの名無しさん
2009/07/22(水) 13:35:26一方で int* mem1, mem2; のように宣言すると勘違いしやすいからな・・・
0901899
2009/07/22(水) 13:38:41ふむ
カンマでだらだら書いていけるから変数側にアスタリスクつける方がいんだろうけどなあ
そういう細かいところがCって洗練されてない気がするわ
0902デフォルトの名無しさん
2009/07/22(水) 14:47:440903デフォルトの名無しさん
2009/07/22(水) 14:56:13int *p,a;
と書けるのをよしとしないで
int* p;
int a;
と分ける
0904デフォルトの名無しさん
2009/07/22(水) 14:57:33していできない使用になってない
指定できない仕様になってない
0905デフォルトの名無しさん
2009/07/22(水) 15:10:15俺もポインタとそうじゃないのを一緒に書くのは好きじゃないな
windowsならポインタもtypedefしてあるのを使う
LPINT a, b, c;
int i, j, k;
みたいな
0906デフォルトの名無しさん
2009/07/22(水) 15:21:54バージョンがあがるといつの間にか実体が変わってることあるんだよね。
機種依存部分だからカプセル化するべきだし、実際そうするわけで、
結局、使える場所はごく一部に限られてくる。
0907デフォルトの名無しさん
2009/07/22(水) 16:53:430908デフォルトの名無しさん
2009/07/22(水) 17:35:240909デフォルトの名無しさん
2009/07/22(水) 22:15:28∩゜Д゜)< m9(^Д^)プギャー
□………(つ | \________
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
0910デフォルトの名無しさん
2009/07/23(木) 03:00:08プログラムを使ってる人の入力に対して必要な配列の数を計算し3次元配列を作るにはどうやればいいでしょうか?
書籍調べててメモリの動的割り当てを使って任意の1次元配列を作る例を拡張してできないかと
考えてはいるのですが上手い方法が思いつきませんでした。
0911デフォルトの名無しさん
2009/07/23(木) 03:02:57ttp://www.kouno.jp/home/c_faq/c6.html
6.16あたり
0912デフォルトの名無しさん
2009/07/23(木) 03:23:22ありがとうございます
これ参考にちょっと考えて見ます
ついでにこのページに他とは違ういろいろ突っ込んだ項目が書いてあるので読んでみよ
0913デフォルトの名無しさん
2009/07/23(木) 05:29:30後はポインタ配列を後から確保してアドレスを代入するという
方法もよく使われるが、二次元配列を超える配列でやろうとすると
頭のパズルになる
0914デフォルトの名無しさん
2009/07/23(木) 09:10:50何か問題ありでしょうか?
a.c
static char *p;
static void errorOp(void)
{
if(getRxData(p) == 0){
rxDataProcess();
}
}
b.c
static char rxBuf[10][10];
char getRxData(char *dt)
{
int i;
if(rxDataManage.wtPt != rxDataManage.rdPt){
dt = rxDataManage.rxBuf[rxDataManage.rdPt];
return 0;
}
else{
return -1;
}
}
0915デフォルトの名無しさん
2009/07/23(木) 09:15:070916デフォルトの名無しさん
2009/07/23(木) 09:31:11{
int i;
if(rxDataManage.wtPt != rxDataManage.rdPt){
*dt = rxDataManage.rxBuf[rxDataManage.rdPt];
return 0;
}
else{
return -1;
}
}
0917デフォルトの名無しさん
2009/07/23(木) 17:57:36プロトタイプ宣言をmyfunc.h
その実体をmyfunc.cなどと2つ作った場合、それをmain.cから利用しようとしたら、
Borland Turbo C++の場合、
> bcc32 main.c myfunc.c
などと指定しなければなりませんよね
でもstdio.hなどは、ただstdio.hをインクルードするだけでprintfはじめ関数を利用できます
で、それらインクルードの関数の実体はlibファイルに定義されていると聞いたことがあります
ということはstdio.hの中では、.cファイルではなく、.libを使うという定義がされているんでしょうか?
0918デフォルトの名無しさん
2009/07/23(木) 18:00:240919デフォルトの名無しさん
2009/07/23(木) 18:08:18bcc32.exeはコンパイラのみではなく、リンカを呼び出す
仕組みも備わっている
0920デフォルトの名無しさん
2009/07/23(木) 18:09:150921デフォルトの名無しさん
2009/07/23(木) 18:09:48どこにあるといった情報はなく、すべての.cと.libの中から目的のものを探す
例えば自分でprintf関数を書いて、そのソースファイルを含めておけば、
.libの中のものではなくそっちがリンクされる (前から順に見て、先に見つかったもの勝ち)
0922デフォルトの名無しさん
2009/07/23(木) 21:22:59いや、河野先生ところのは、それはそれでいいんですけれども、x[a*i + b*j + k] でお茶をにごすのが簡単ではないかと。
0923デフォルトの名無しさん
2009/07/23(木) 22:01:57これでも使ってろ
void *dim3_alloc(int w, int h, int d, int size){
char ***a=NULL, **b=NULL, *c=NULL;
int y, z;
a=malloc(sizeof(void*)*d);
b=malloc(sizeof(void*)*d*h);
c=calloc(d*h*w, size);
if(!a || !b || !c){
if(a) free(a);
if(b) free(b);
if(c) free(c);
return NULL;
}
for(z=0;z<d;z++){
a[z]=&b[h*z];
for(y=0;y<h;y++){
a[z][y]=&c[size*(h*z+y)*w];
}
}
return a;
}
void dim3_free(void *ptr){
void ***p=ptr;
if(!p){
free(p[0][0]);
free(p[0]);
free(p);
}
}
0924デフォルトの名無しさん
2009/07/23(木) 23:06:46int *p=0;
ってのはプロでも使ってるんですか?
0925デフォルトの名無しさん
2009/07/24(金) 00:10:36int func ( int, int );
int x = 20;
int y = 15;
int main (){
x = func( x, 10 );
printf("�@x:%3d y:%3d\n", x, y );
y = func( y, -10 );
printf("�Ax:%3d y:%3d\n", x, y );
for( x=5 ; x>0 ; x-- ){
func( 10, 5 );
printf("�Bx:%3d y:%3d\n", x, y );
}
return 0;
}
int func( int a, int b ){
int y;
if( a > b ){
y = 5;
x = -10;
}
else{
y = -5;
}
return y;
}
これの表示が
�@x: 5 y: 15
�Ax:-10 y: 5
�Bx:-10 y: 5
となるんだが意味ワカンナイ
だれか教えてください
0926デフォルトの名無しさん
2009/07/24(金) 00:13:06Cでそれはあんまり見ないかなあ。
0927デフォルトの名無しさん
2009/07/24(金) 00:17:40変数のスコープの勉強でもしてんのかな。
じっくりおえば分かるからがんばって
0928デフォルトの名無しさん
2009/07/24(金) 09:18:26http://www.agara.co.jp/modules/dailynews/newsphoto/1720561.jpg
ワモンちゃん
http://www.afftis.or.jp/konchu/gokiburi/img/gok18.JPG
クロちゃん
http://mushitori.jp/diary/0707/kurogokiburi.jpg
ヤエヤママダラちゃん
http://www.asahi-net.or.jp/~DP7A-TNKW/gokiburi.JPG
チャバネちゃん
http://www.clean-life.net/mb4.jpg
例の恐怖動画はこちら
http://www.youtube.com/watch?v=UXmqnAHa4Vs
0929デフォルトの名無しさん
2009/07/24(金) 09:37:20何がしたいの?
0930デフォルトの名無しさん
2009/07/24(金) 10:29:05あたりまえに使うが、空ポインタっていう呼び方はしないな
>>925
まずどこがわからないのか?
1行目からか?
わかるところとわからないところをはっきりさせるべき
0931デフォルトの名無しさん
2009/07/24(金) 10:29:22そりゃプロもピンキリだから。
ヌルポが0000:0000とは限らないから本当はやるべきじゃない。
大多数の環境では0だから、それで暴走することは滅多にないと思うけど
だからやってもいいという理由にはならない。
0932デフォルトの名無しさん
2009/07/24(金) 10:30:54何言ってんの?ポインタに0を代入するのは特別な扱いを受ける
事も知らずにでたらめ書くなアホ
0933デフォルトの名無しさん
2009/07/24(金) 10:32:34ソース上の0は常にターゲット環境でのぬるぽを意味する。
0934デフォルトの名無しさん
2009/07/24(金) 10:33:48直接0を入れるのはケースにもよるが・・・
0935デフォルトの名無しさん
2009/07/24(金) 10:50:090936デフォルトの名無しさん
2009/07/24(金) 10:52:500937デフォルトの名無しさん
2009/07/24(金) 10:54:383.2.2.3 Pointers
An integral constant expression with the value 0, or such an
expression cast to type void * , is called a null pointer constant. If
a null pointer constant is assigned to or compared for equality to a
pointer, the constant is converted to a pointer of that type. Such a
pointer, called a null pointer, is guaranteed to compare unequal to a
pointer to any object or function.
0938デフォルトの名無しさん
2009/07/24(金) 12:09:25malloc()が重いのでなるべく回数を減らすにはこうすればいいが
ノートに図を書いて自分でもやっと理解できた
実用的ではない
malooc()の回数が増えても>>911の方法がいいな
#include <stdio.h>
#include <stdlib.h>
/* 例えば3次元配列で1000000個ほど配列が欲しいとする(例えば10 * 100 * 1000) */
int main(void)
{
int i, j, k, l = 0, ***array2, **array1, *array;
array = (int *)malloc(sizeof(int) * 10 * 100 * 1000); /* 一度に確保する */
array1 = (int **)malloc(sizeof(int *) * 10 * 100); /* 例えば */
array2 = (int ***)malloc(sizeof(int **) * 10);
for (i = 0; i < 10; i++) {
array2[i] = array1 + i * 100;
for (j = 0; j < 10 * 100; j++)
array1[j] = array + j * 1000;
}
for (i = 0; i < 10; i++)
for (j = 0; j < 100; j++)
for (k = 0; k < 1000; k++)
array2[i][j][k] = ++l;
free(array2);
free(array1);
free(array);
return 0;
}
0939デフォルトの名無しさん
2009/07/24(金) 12:41:35以前 宿題スレで似たようなのがあった
(最終の printf になる為には main 内の変数の初期値を求めよ って奴)
手で追うと間違えや見逃し発生しちゃうので
mathmatica とかの式評価が可能なシステムの補助が欲しいねー
>>925 の事例は結果追跡だけなので、変数名の付け替えだけですっきりするが
0940デフォルトの名無しさん
2009/07/24(金) 13:21:37C FAQ読み直せ
0941デフォルトの名無しさん
2009/07/24(金) 13:23:05ヌルポをintにキャストした時は、その処理系での本当のアドレスにかかわらず
0x0000になるが、逆は規定されていない=保証されていない
ヌルポが0と等価であることが保証されるのはC++の話。Cは上に書いたとおり。
有名なFAQにも0で代用するべきではないと書いてある。
ttp://c-faq.com/null/machexamp.html
0942デフォルトの名無しさん
2009/07/24(金) 13:30:00構造体pというのがあったとして、その内容が
p
{
char moji;
}
とかだったとします。このPをCallocを使って領域を確保して、
FOR文でp[1]〜p[27]までのそれぞれのmojiにアルファベットを順番に入れていったとき、
入れ終わってから例えばprintf("%s",p[5].moji)のようにすると、「e」が表示されるべきなのに
「z」が表示されてしまいます。
いったい何がおかしいのでしょうか?
0943デフォルトの名無しさん
2009/07/24(金) 13:31:56%s に対応する引数は char const *
0944デフォルトの名無しさん
2009/07/24(金) 13:32:20表示は文字列フォーマットの %s ではなく文字フォーマットの %c でやる
0945デフォルトの名無しさん
2009/07/24(金) 13:48:09> ヌルポをintにキャストした時は、その処理系での本当のアドレスにかかわらず
> 0x0000になるが、逆は規定されていない=保証されていない
An integral constant expression with the value 0, or such an
expression cast to type void * , is called a null pointer constant.
と矛盾するんじゃないかな。
> 0で代用するべきではないと書いてある。
そんなの書いてなかったと思うが。
0946デフォルトの名無しさん
2009/07/24(金) 13:55:29可変引数の終端記号として NULL を要求しているようなのは
sizeof(int) != sizeof(void*) で破綻する
0947942 お願いします
2009/07/24(金) 13:55:39さっきFOR文で文字列を格納しながら、ちゃんと文字が格納されているかprintf("%s\n",p[n].moji)(nはFOR文を回してる変数です)で
確かめてみたのですが、それだときちんと「abc・・・」となっているのです。
なのに、文字列格納のFOR文が終わってから、もう一度新しいFOR文でprintf("%s/n",p[n].moji)を順番に表示させると、
「zzz…」という風になってしまうんです。いったい何が原因なのでしょうか?
実は今規制されていまして、このレスも代理を頼んでやってもらっています。なのでお礼のレスは出来ないと思います。
すみません。これまでレスしていただいた方、これからレスしていただける方、ありがとうございます。
0948デフォルトの名無しさん
2009/07/24(金) 13:56:08さっきFOR文で文字列を格納しながら、ちゃんと文字が格納されているかprintf("%s\n",p[n].moji)(nはFOR文を回してる変数です)で
確かめてみたのですが、それだときちんと「abc・・・」となっているのです。
なのに、文字列格納のFOR文が終わってから、もう一度新しいFOR文でprintf("%s/n",p[n].moji)を順番に表示させると、
「zzz…」という風になってしまうんです。いったい何が原因なのでしょうか?
実は今規制されていまして、このレスも代理を頼んでやってもらっています。なのでお礼のレスは出来ないと思います。
すみません。これまでレスしていただいた方、これからレスしていただける方、ありがとうございます。
0949デフォルトの名無しさん
2009/07/24(金) 13:58:03スレ汚し失礼しました
0950デフォルトの名無しさん
2009/07/24(金) 13:58:40全部同じ領域を指していないか?
0951デフォルトの名無しさん
2009/07/24(金) 14:00:17ソースがあがっているわけではないので、エスパー
代入しているのは ループ内で宣言されたローカルな変数へのポインタ じゃね?
ループ抜けると ループ内で宣言されたローカルな変数 は居ないから
ポインタの指している先は あれー? ってなるぜよ
配列・ポインタ・文字列 周辺をもういっかい整理してみるべし
0952デフォルトの名無しさん
2009/07/24(金) 14:01:27構造体の中ってこれだけ?
これってさまず終端文字のことが考えられてないのと
パディングのことを想定してるのかな?
0953デフォルトの名無しさん
2009/07/24(金) 14:47:29高度な問題なのかと勝手に思い込んで時間使っちまったじゃないか
どうしてくれるんだ
0954デフォルトの名無しさん
2009/07/24(金) 15:40:30ASCIIじゃダメなのか?
バイナリのメリットってあんの?
0955デフォルトの名無しさん
2009/07/24(金) 15:47:42無変換だ ということがメリット
ビットマップなんかの書き出しに たまたま登場した 0x0a が
ファイルに書く時 0x0d 0x0a なんて変換されたらかなわん
0956デフォルトの名無しさん
2009/07/24(金) 15:50:40数値データなんかだとascii形式の方が可搬性が高いね
バイナリデータの必要性が感じられないなら使わなくていいよ
0957デフォルトの名無しさん
2009/07/24(金) 15:55:51なんかむずいな。
よくわからん。
普通にプログラミングしてたら使わないか?
それとも使うか?
0958デフォルトの名無しさん
2009/07/24(金) 16:05:15ASCIIではデータ量が多くなってしまう
画像なんかを保存するとき、バイナリで保存すればRGB各1バイトずつで済むのに
ASCIIで 255 255 255 なんて書いてたらファイルサイズが2〜4倍になってしまう
0959デフォルトの名無しさん
2009/07/24(金) 16:13:03バイナリ形式になってるってこと?
なんとなくわかったありがとう。
0960デフォルトの名無しさん
2009/07/24(金) 16:15:41fwarite か? fprintf か? って話だな
メリット
出来上がるファイルサイズを小さくおさえることができる
読み込みに楽できる(かも?
文字解釈云々をすっとばせるので速い(かも?
デメリット
メモ帳で編集できない
メモ帳で見たところで化け化けのぐちゃぐちゃ
0961デフォルトの名無しさん
2009/07/24(金) 16:15:59「標準ライブラリではテキスト・ストリームと2進ストリームをサポートするが、
UNIXのようなシステムではこれらは同じになっている」
0962デフォルトの名無しさん
2009/07/24(金) 18:10:070963デフォルトの名無しさん
2009/07/24(金) 18:11:22変わらない程度ならつけようがつけまいが
むしろ変えたくないところ、変えちゃだめなところをconstにしておけば
コンパイルの段階で変えるコードをエラーで弾ける
0964デフォルトの名無しさん
2009/07/24(金) 19:43:120965デフォルトの名無しさん
2009/07/24(金) 19:47:130966デフォルトの名無しさん
2009/07/24(金) 19:52:200967デフォルトの名無しさん
2009/07/24(金) 19:52:47constと最適化の関係がわからない
もしかしてrestrict
0968デフォルトの名無しさん
2009/07/24(金) 20:01:12面倒臭くない?
0969デフォルトの名無しさん
2009/07/24(金) 21:49:44ローカル変数でやるってこと?
それはめんどくさいだろう。
0970デフォルトの名無しさん
2009/07/24(金) 21:55:52> constって値が変わらない変数やポインタにはすべてに付けたほうがいいんでしょうか?
付けても付けなくてもいい場合と、
付けなければならない場合があることは理解してる?
0971デフォルトの名無しさん
2009/07/24(金) 22:00:31付けなければならない場合ってどんな時でしょうか?
いまいちわかりません。
0972デフォルトの名無しさん
2009/07/24(金) 22:03:20こんなん
const char *hoge(void){
return "hoge string";
}
0974デフォルトの名無しさん
2009/07/24(金) 22:26:220975デフォルトの名無しさん
2009/07/24(金) 22:31:470976デフォルトの名無しさん
2009/07/24(金) 22:32:35前に質問したものですが参考にさせていただきます
度々ありがとうございます
0977デフォルトの名無しさん
2009/07/24(金) 22:34:50戻り値にconstを使うということは
なぜでしょうか?
0978デフォルトの名無しさん
2009/07/24(金) 22:34:58ファイルアクセス系も引数にconst付いてることが多いし
自分で文字列から情報を調べたりする関数を作る際にも
受け取るchar型の配列(のポインタ)はconstつけるねえ
0979デフォルトの名無しさん
2009/07/24(金) 22:35:37とりあえず全部つければいいと思うよ
0980デフォルトの名無しさん
2009/07/24(金) 22:37:17適当なこというなよ
0981デフォルトの名無しさん
2009/07/24(金) 22:39:230982デフォルトの名無しさん
2009/07/24(金) 22:47:540983デフォルトの名無しさん
2009/07/24(金) 22:58:53これって、*(*ojisan)(void);をintという型と同じにするって意味なんですかね…
typedef int NewINT;
とかなら、NewINTがintとして使えるから直感的にわかるんですが
この手の関数ポインタのtypedefを理解するようなコツってあるんでしょうか
0984デフォルトの名無しさん
2009/07/24(金) 23:00:49// 宣言
const char* foo(float f, const DATA* p, DATA d);
// 定義
const char* foo(float const a, const DATA* const p, DATA const d)
{
static const char* const ret = "くぁwせdrftgyふじこlp;@";
return ret;
}
0985デフォルトの名無しさん
2009/07/24(金) 23:15:05ojisan == int* (*foo)(void) を入れるための型
== int* foo(void) のポインタ を入れるための型
って考えればいいと思う
#include <stdio.h>
int* foo(void) {
static int ary[] = {0, 1, 2, 3};
return ary;
}
int main() {
typedef int *(*ojisan)(void);
ojisan func = &foo;
int* ptr = (*func)();
printf("%d, %d", ptr[0], ptr[1], ptr[2], ptr[3]);
return 0;
}
C言語なら俺に聞け(入門篇) Part 51
http://pc12.2ch.net/test/read.cgi/tech/1248445143/
0988デフォルトの名無しさん
2009/07/25(土) 00:17:55関数ポインタを解読するときは
型 (*関数ポインタ)(引数)
っていう基本形を覚えておくといいよ
int *(*ojisan)(void)
↓
ojisanは関数ポインタ
ojisanの引数は -- (void)
ojisanの戻り値は -- int *
0989デフォルトの名無しさん
2009/07/25(土) 01:27:23見事なまでに逆を言ってないか?
0をポインタ型にキャストした場合は、内部表現が0ではない処理系においても
ヌルポインターとなることが保証されてるよ
0990デフォルトの名無しさん
2009/07/25(土) 01:42:18それを、一つのソースファイル以外ではexternをつけてコンパイルしたいんだけど、どうしたらいい?
ヘッダーファイル
|
/\
ソース1 ソース2
ソース1ではdouble a[10]、ソース2ではextern double a[10]というふうにコンパイルしたいんでふ。
0991デフォルトの名無しさん
2009/07/25(土) 01:53:020992デフォルトの名無しさん
2009/07/25(土) 04:14:27初期化しなかったら何も考えずにできるんですけどね。ヘッダーファイルのグローバル変数を初期化する必要がありますか?
0993992
2009/07/25(土) 04:17:29ヘッダーファイルのなかでグローバル変数に値を初期化するような書き方をしていますか?
単に宣言しているだけなら、なにも考えずにOK、初期化しているのならばNGらしい。
0994デフォルトの名無しさん
2009/07/25(土) 04:36:07#ifndef GLOBAL_DEFINITION
#define GLOBAL_DEFINITION extern
#endif
GLOBAL_DEFINITION double a[10];
そして、1つのソースで#define GLOBAL_DEFINITIONしてから当該のヘッダをインクルードする。
なお、__attribute__((common))とか__declspec(selectany)のように処理系依存の方法もある。
0995デフォルトの名無しさん
2009/07/25(土) 05:07:560996デフォルトの名無しさん
2009/07/25(土) 07:57:24#define FOO 100
extern bar baz[FOO];
--garray.c
#include "garray.h"
bar baz[FOO] = {・・・};
--main.c
#include "garray.h"
int main(void) {
baz[0] = ・・・;
baz[1] = ・・・;
・・・
0997デフォルトの名無しさん
2009/07/25(土) 08:41:42正確には,malloc,realloc,fopen等のポインタを返す著名な
関数が((void*) 0)をエラーケースについて返すように
協定してるだけで( (void*) 0 )がアクセス不能な何らかの
型へのポインタ値(普通こういった領域へのポインタを
ヌルポインタと総称する。)になっているという保証もない
実はアクセスしても問題の無いケースも少なからずあるが、
標準関数で使用しているものに合わせるとメリットが多いし
なによりも整数0と同一視可能なので、
if( ptr )だとかif( !prt )のような短縮表記が可能になるという
理由でNULL( (void*)0 )は多用されている。
NULLをヌルポインタと呼ぶのはやめたほうがいい。
ヌルと呼ぶのは良いが、Cではヌルポインタという概念は
文法上実は存在しない。
0998デフォルトの名無しさん
2009/07/25(土) 09:02:06>>937 を読め。
0999デフォルトの名無しさん
2009/07/25(土) 09:43:22どこの入門書にもNULLはヌル(ナル)ポインタで、
言語使用のレベルで特別扱いされるって書いてあるだろ。
1000デフォルトの名無しさん
2009/07/25(土) 10:17:40以降次スレで
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。