【初心者歓迎】C/C++室 vol.18
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/06/06(月) 00:12:02エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
http://pc8.2ch.net/test/read.cgi/tech/1115958601/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0002デフォルトの名無しさん
2005/06/06(月) 00:20:580003デフォルトの名無しさん
2005/06/06(月) 00:46:47| >>1が書き忘れたみたいだけど
∧_∧ | このスレは環境依存の内容も
♪〜 ( ´∀)∠ 激しくOKらしいモナ〜
j つ-) l______________
((,,,_ く ヾ
;''⌒ヽー'、,_)7'⌒ヽ
':;.,___ノ""""ヘ.,___ノ
0004デフォルトの名無しさん
2005/06/07(火) 22:01:49忘れたのはスレタイにだけだろw
4様
0005デフォルトの名無しさん
2005/06/08(水) 12:48:470006デフォルトの名無しさん
2005/06/08(水) 14:06:460007デフォルトの名無しさん
2005/06/08(水) 15:20:41どこを7め読みすればいいんですか?
0008デフォルトの名無しさん
2005/06/08(水) 16:02:010009デフォルトの名無しさん
2005/06/08(水) 16:03:270010デフォルトの名無しさん
2005/06/08(水) 16:22:55#include <stdlib.h>
int main()
{
int **p;
int i, j, x, y;
scanf("%d %d", &x, &y);
p = (int**) malloc(sizeof(int*) * x);
for (i = 0; i < x; i++) {
p[i] = (int*) malloc(sizeof(int) * x);
}
for (i = 0; i < y; i++) {
for (j = 0; j < x; j++) {
p[i][j] = NULL;
printf("%d", p[i][j]);
}
printf("\n");
}
for (i = 0; i < x; i++) {
free(p[i]);
}
free(p);
return 0;
}
二次元配列を行>列で(↑ではx=4,y=5など)動的確保すると
開放の時失敗してしまうのは何故ですか?
0011デフォルトの名無しさん
2005/06/08(水) 16:29:43x と y を使う場所がかなり混乱してるよ。
あと、p[i][j]はintだから、NULLを代入しちゃダメ。
0012デフォルトの名無しさん
2005/06/08(水) 16:31:29確保する時に両方要素数がxになってるぞ。どっちかはyのつもりなんだろう?
あと、
p[i][j] = NULL;
はintとint*のサイズが同じマシンでは動くことは動くだろうが、
正しくは
p[i][j] = 0;
だな。
0013デフォルトの名無しさん
2005/06/08(水) 16:38:09NULLを(void *)0としているC処理系ではエラーだろうな。
0015デフォルトの名無しさん
2005/06/08(水) 16:55:25MicrosoftのCLコンパイラはただのワーニングで通すよ、
エラーではなく。
エラーにするコンパイラ、ある?
__STDC__ではNULLは(void*)0
__cplusplusなら0
と定義してる処理系が多いのではないだろうか。
001610
2005/06/08(水) 18:16:13p = (int**) malloc(sizeof(int*) * x);
for (i = 0; i < x; i++) {
p[i] = (int*) malloc(sizeof(int) * x);
}
x,yの位置の組み合わせ(↑だとxxx)を全パターン試してみましたが
結果
○:一見動いているように見える。
×:Debug Error! DAMAGE: after Normal block〜省略
不:不正な処理。
A:アドレス?がprintfされた。
入力値
1: x=y
2: x>y
3: x<y
___|1|2|3
xxx|○|○|不
xxy|○|×|不
xyy|○|×|×
yyy|○|×|○
yxy|○|×|A
xyx|○|×|×
yxx|○|×|A
yyx|○|×|×
全滅ですた…
0017デフォルトの名無しさん
2005/06/08(水) 18:23:08p = (int**) malloc(sizeof(int*) * y);
for (i = 0; i < x; i++) {
p[i] = (int*) malloc(sizeof(int) * x);
}
だろ。
0018デフォルトの名無しさん
2005/06/08(水) 18:25:29まずxとyの意味をはっきりさせろ。
0019デフォルトの名無しさん
2005/06/08(水) 18:26:16for (i = 0; i < y; i++) {
だろ。
0020デフォルトの名無しさん
2005/06/08(水) 18:32:44問題はそこだけじゃない。
ぜんぶのforで、iが0からいくつで変化するか、考えてみよう。
0021デフォルトの名無しさん
2005/06/08(水) 18:35:43もしくは>>19的な p[i][j] と p[y][x] でもいいし。
とりあえずp[x][y]でいくなら>>16と>>17の3行は上からx, x, y。
それと>>10の
for (i = 0; i < y; i++) {
for (j = 0; j < x; j++) {
のとこ逆。
p[y][x]でいくならまた話は変わるけど。
002210
2005/06/08(水) 18:45:05>>21
x:列(横)
y:行(縦)
p[行][列]のつもりでした。
>>18
x,y→row, colにしました。
>>17-21
引続き試行錯誤してみます。
002310
2005/06/08(水) 19:12:58int main()
{
int **p;
int i, j, row, col;
scanf("%d %d", &row, &col);
p = (int**) malloc(sizeof(int*) * col);
for (i = 0; i < col; i++) {
p[i] = (int*) malloc(sizeof(int) * row);
}
for (i = 0; i < col; i++) {
for (j = 0; j < row; j++) {
p[i][j] = 0;
printf("%d", p[i][j]);
}
printf("\n");
}
for (i = 0; i < col; i++) {
free(p[i]);
}
free(p);
return 0;
}
x,yという名前でさらに混乱してました
アドバイスありがとうございました。
0024デフォルトの名無しさん
2005/06/08(水) 19:32:12こうすると解放が簡単。
int main(void)
{
int **p;
int i, j, row, col;
scanf("%d %d", &row, &col);
p = (int **)malloc(sizeof(int*) * col);
p[0] = (int *)malloc(sizeof (int) * row * col);
for (i = 1; i < col; i++) {
p[i] = p[0] + row * i;
}
for (i = 0; i < col; i++) {
for (j = 0; j < row; j++) {
p[i][j] = 0;
printf("%d ", p[i][j]);
}
printf("\n");
}
free(p[0]);
free(p);
return 0;
}
0026デフォルトの名無しさん
2005/06/09(木) 02:47:27目的としているんですが、どうもうまくいきません
コンパイルはできるのですがxの値が2を超えた瞬間に
「*a[i] = new int [y];」の部分がエラーといわれて止まってしまいます
どういうことなんでしょうか?
void make(int ***a , int x , int y)
{
*a = new int* [x];
for(int i=0; i<x; i++){
*a[i] = new int [y];
}
}
void main()
{
int **a, x , y ;
cout<< "値入力\n";
cin >> x >> y;
make(&a, x , y);
}
0027デフォルトの名無しさん
2005/06/09(木) 02:48:58002826
2005/06/09(木) 02:52:34無事エラーが無くなりましたm(_ _)m
0029デフォルトの名無しさん
2005/06/09(木) 04:41:52それはマズイだろ・・・
0030デフォルトの名無しさん
2005/06/09(木) 15:25:00readはその数を返してくれませんよね。
freadは返してくれるけどstdioをインクルードしないといけないから本来はCの関数ですよね?
C++ではどうやるんでしょうか?
0031デフォルトの名無しさん
2005/06/09(木) 15:28:15#include <cstdio>と書けばstd::freadがある。
0032デフォルトの名無しさん
2005/06/09(木) 15:45:26read()は返してくれるだろ
まあread()は標準じゃないけどな
003330
2005/06/09(木) 16:02:12上手く出来ました。
0034デフォルトの名無しさん
2005/06/09(木) 16:20:10>でもbasic_istream.readは廃止予定みたいなワーニングがでます。
前スレでこんなんあったんだけど
書式なしで読み込みたい場合、readの代わりに何を使ったらいいんですか?
0035デフォルトの名無しさん
2005/06/09(木) 18:33:13その変数の8ビット目の次の無関係の領域のビットに繰り上がりますか?
つまり
char a[4];
a[3]++;
というような処理で、aをunsigned intの様に扱えるのだろうかという事です。
0036デフォルトの名無しさん
2005/06/09(木) 18:36:41扱えません。
どうでもいい話だが
charがsignedで8bitなら、「255」は入らないだろ
unsignedと仮定すると、255の時点でインクリメントすると0になる
0037デフォルトの名無しさん
2005/06/09(木) 18:44:400038デフォルトの名無しさん
2005/06/09(木) 18:46:55K&Rにそう明記されている
0039デフォルトの名無しさん
2005/06/09(木) 18:51:140040デフォルトの名無しさん
2005/06/09(木) 21:18:040041デフォルトの名無しさん
2005/06/09(木) 21:50:340042デフォルトの名無しさん
2005/06/09(木) 23:17:410043デフォルトの名無しさん
2005/06/09(木) 23:20:58まあどうでもいい話だな
0044デフォルトの名無しさん
2005/06/09(木) 23:25:510045デフォルトの名無しさん
2005/06/10(金) 06:57:390046デフォルトの名無しさん
2005/06/10(金) 07:04:17メモリ上に既に他のプロセスで読み取り専用で開かれたそのファイルのデータがあったら
HDDにアクセスする事無くそのメモリ上のデータへのポインタを返して欲しいのだけど
そういう機能ってあるんでしょうか?
例えばWEBページの静的ページなどはメモリ上に固定化して置いておけると
HDDアクセス無く出力できるので
もしそういう機能が無いなら何らかの方法でそういう方法を取ろうと思うのですが。
0047デフォルトの名無しさん
2005/06/10(金) 07:11:090048デフォルトの名無しさん
2005/06/10(金) 07:14:44他プロセスの持ってるポインタをクレって時点で普通じゃないと知れ
0049デフォルトの名無しさん
2005/06/10(金) 07:28:08例えばOSとかapacheでそのデータをメモリ上に固定して置いて
ページ生成時にそれを使うとか。
>>47
fopenがディスクキャッシュを使っていると思って良いのでしょうか?
こういうライブラリの詳細な内容って何処かで分からないものでしょうか。
0050デフォルトの名無しさん
2005/06/10(金) 07:34:33「fopenが」ではなく「OSが」そんなディスクキャッシュを持っている。
OSを信じてやろうよ。
0051デフォルトの名無しさん
2005/06/10(金) 08:47:310052デフォルトの名無しさん
2005/06/10(金) 09:15:07できそうな気はするけど、他のプロセスにとって迷惑でしかないと思われるので本当にシビアな場合以外は、
素直に OS に任しておくべきだと思う。
0053デフォルトの名無しさん
2005/06/10(金) 11:08:18どうやって?
0054デフォルトの名無しさん
2005/06/10(金) 13:29:28#include <cstring>
using namespace std;
// 受け取った文字列を逆順にする関数
void Reverse (char *str)
{
int i, j; char temp;
for (i = 0, j = strlen(str) - 1; i < j; i++, j--) {
temp = str[i];
str[i] = str[j]; // どうやら、これがエラー
str[j] = temp; // どうやら、これがエラー
}
}
int main ()
{
char *str = "abcdefgh";
Reverse(str);
cout << str << "\n";
return 0;
}
すみません、質問です。
↑のは文字列を逆にする関数ですが、
関数内で文字列を代入するときエラーが出てしまいます。
これはなぜなんでしょうか。
ツールはVisual C++ 6.0を使ってます。
コンパイルは通るけど、実行段階でエラーが出てます。。
0055デフォルトの名無しさん
2005/06/10(金) 13:41:19{
int i, j;
char temp, *_str2;
_str2 = &str[strlen(str) - 1]; // 最後の文字のポインタを格納
for (i = 0, j = strlen(str) - 1; i < j; i++, j--) {
temp = *str;
*str = *_str2;
*_str2 = temp;
str++; // 先頭から進める
_str2--; // 後ろから戻す
}
}
どうも↑でもダメなようです。
根本的に考え方が間違ってるんでしょか。
0056デフォルトの名無しさん
2005/06/10(金) 13:42:21char str[] = "abcdefgh";にすれば動くと思うよ。
""で括った文字列リテラルはconstだから書き換えできない。
char []にするとそこへ文字列のコピーを作るということになって書き換えできる。
005754-55
2005/06/10(金) 13:48:06うほっ、できました!
char *str = "abc" は自動的にconstになるんですか・・
そえば、なんかどっかで「基本的に書き換えちゃだめ」とか聞いたかも。
一つ勉強になりました。
どうもありがとー。
0058デフォルトの名無しさん
2005/06/10(金) 17:58:37#include <iostream.h>
#include "hoge.h"
void main()
{util();}
────── hoge.h ─────────
extern void util();
────── util.cpp ────────
#include <iostream.h>
void util()
{cout << "run" << endl;}
────── makefile ────────
out.exe:main.obj util.obj
[タブ]bcc32 main.obj util.obj
main.obj:main.cpp hoge.h
[タブ]bcc32 -c main.cpp
util.obj:util.cpp
[タブ]bcc32 -c util.cpp
makeを用い、以上のファイルをコンパイルしたいのですが
Error makefile Command syntax errorと出てコンパイル出来ません
すみませんがどうか正しいmakefileの書き方を教えて下さい
0059デフォルトの名無しさん
2005/06/10(金) 18:30:38make makes many problems
http://pc8.2ch.net/test/read.cgi/tech/1029599472/
0060デフォルトの名無しさん
2005/06/10(金) 18:32:31俺のとこではエラーでなかったけど、まあ他に気になったのが
out.exe:main.obj util.obj
[タブ]bcc32 -e$@ main.obj util.obj
って風につけくわえないと main.exe って名前になってしまう。
0061デフォルトの名無しさん
2005/06/10(金) 18:48:56ヘルプを調べたのですが↓
basic_string::reverse_iterator
typedef reverse_iterator<iterator, value_type,
reference, pointer, difference_type>
reverse_iterator;
この型は、制御シーケンスの逆方向反復子としてオブジェクトを定義します。
読み方がまったくわかりません。
いったいどうやって使えばよいのでしょうか?
これで文字列を逆順で表示できると思ったのですが。
0062デフォルトの名無しさん
2005/06/10(金) 19:01:44typedef std::string::reverse_iterator riter;
std::string s = "abcdefg";
for ( riter r = s.rbegin(); r != s.rend(); r ++ )
std::cout << * r;
0063デフォルトの名無しさん
2005/06/10(金) 19:01:59std::string::reverse_iteratorとstd::reverse_iterator<std::string::iterator>は同じもの。
実際には,rbegin(), rend()を、
std::string str;
std::copy(str.rbegin(), str.rend(), std::ostream_iterator<char>(std::cout));
みたいに使う。
0064デフォルトの名無しさん
2005/06/10(金) 19:04:22K&R時代のふるーいCプログラムの場合は確信犯的に
文字列リテラルの中身を書き換えたりするものもある。
実際、文字列リテラルをどういったセグメントに配置するかはコンパイラによるし、
オプションで変更できる場合も多い。
readonlyなセグメントに配置された場合は、当然それを
書き換えようとすればsegmentation faultになる。
俺の知る限り、gccはデフォルトでTEXTに配置し、MicrosoftのCLはDATAに配置する。
ま、今のスタイルとして、文字列リテラルを書き換えるのは間違いなく「邪悪」だから、
やらないほうが良いのは確かだな。
0065デフォルトの名無しさん
2005/06/10(金) 19:10:090066デフォルトの名無しさん
2005/06/10(金) 19:42:30できました、ありがとうございました。
> std::copy(str.rbegin(), str.rend(), std::ostream_iterator<char>(std::cout));
けれど、これはコピペしてみたのですが
'ostream_iterator' : 'std' のメンバではありません
'ostream_iterator' : 定義されていない識別子です。
と、出て動きませんでした。うーむ・・・
template については少し理解があるつもりなのですが、
reverse_iterator<iterator, value_type,reference, pointer, difference_type>
とある場合、何を入れたらいいのかがわかりません。もう慣れるしかないんですかね
なにはともあれ、レスありがとうございました。申し越し頑張ってみます
0067デフォルトの名無しさん
2005/06/10(金) 19:59:50ありがとうございます、ちょっと敷居が高そうですがもう少し頑張ってみます
0068デフォルトの名無しさん
2005/06/10(金) 20:01:08#include <iterator>してる?
0069デフォルトの名無しさん
2005/06/10(金) 20:05:10ostream_iteratorは<iterator>をインクルードすると使える。
> reverse_iterator<iterator, value_type,reference, pointer, difference_type>
こんな型は標準にはない。reverse_iteratorには引数をひとつ渡せば十分。
仮に処理系が余分なパラメタを設定しているとしても、指定しなくても良いように
デフォルト引数があるはず。
0070デフォルトの名無しさん
2005/06/10(金) 20:18:07成功しました。何度もありがとうございます。
>>69
デフォルト引数! 最近知ったばかりです。そうなのでしたか、
安心しました。m(_ _)m
あと、一応関係ないですが、僕は55の人じゃないので、
質問が似てただけで、偽者とかじゃないです。
気を悪くしてたらすみません >55
0071デフォルトの名無しさん
2005/06/10(金) 20:43:14半角を全角にしたくて前スレにもあった質問を見てみました。
検索した結果がこれなんですが
http://www.geocities.co.jp/SiliconValley/4805/bcbtips/bcbtips085.htm
vcl.hが無いせいかAnsiString型が使えないのと
エラーを吐き出してしまいます。どのようにすればよいのでしょうか?
0072デフォルトの名無しさん
2005/06/10(金) 21:54:070073デフォルトの名無しさん
2005/06/10(金) 22:36:35どの変換も肝はLCMapString。
AnsiStringはstd::stringやCStringにでも置き換えろ。
0074デフォルトの名無しさん
2005/06/10(金) 22:43:19#include <windows.h>
#include <string>
#include <vector>
std::string han_to_zen(std::string han)
{
std::vector<char> buf(LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han.c_str(), -1, 0, 0));
LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han.c_str(), -1, &buf[0], buf.size());
return std::string(&buf[0]);
}
#include <iostream>
int main()
{
std::cout << han_to_zen("ゴルァ");
return 0;
}
0075デフォルトの名無しさん
2005/06/10(金) 23:52:08CPU セレロンD335 2.8GHz
メモリ 512MB
開発環境 VisualC++6.0
#include <stdio.h>
const int A = 1024;
const int B = 128;
int main()
{
double hairetu[A][B];
return 0;
}
上記のように配列を宣言するだけのプログラムですが。これを実行すると
「問題が発生したため、test.exe を終了します。 ご不便をおかけして申し訳ありません。」
と表示されプログラムが正常に動いてくれません。
配列の要素数がこの半分のときは普通に動くのですが。
メモリが足りないのでしょうか?対処法があれば教えてください。
0076デフォルトの名無しさん
2005/06/10(金) 23:56:44リンカの設定でスタックサイズを増やせ。デフォルトでは1MBだ。
0077デフォルトの名無しさん
2005/06/11(土) 00:46:48本当に感謝。有難う。
007875
2005/06/11(土) 01:28:54ベリーサンクス。プロジェクト→設定→リンク→アウトプット→スタックアロケーション
で2000000と打ってみたらうまくいきました。これであってますよね?
0079デフォルトの名無しさん
2005/06/11(土) 01:56:59ま、それで動くけど、俺なら0x200000と入れたいな。好き嫌いの問題だが。
0080デフォルトの名無しさん
2005/06/11(土) 08:31:29#include<time.h>
int main(){
char a[100] = "";
time_t *b;
time(b);
strftime(a,99,"%Y/%m/%d %H:%M:%S",localtime(b));
cout << a << endl;
}
このプログラムで目的の時刻表示は出来たのですが、もっとスマートな書き方ってありませんか?
0082デフォルトの名無しさん
2005/06/11(土) 08:41:240083デフォルトの名無しさん
2005/06/11(土) 08:43:45方法もありますよ。
あと、*bはメモリを自分で確保してるわけではないので、
開放は必要ないかと。
008480
2005/06/11(土) 08:45:37システムの時刻データ保持領域へのポインタをくれるのかと思ってたんですが
time_t b;
time(&b);
localtime(&b);
とやるのですね。
008580
2005/06/11(土) 08:50:03sizeof(time_t)分のメモリが書き換えられてしまって
他のプロセスに影響が出る可能性があるのかな。
連投すみません。
0086デフォルトの名無しさん
2005/06/11(土) 08:53:38あ、間違えた >>83は、>localtime()を使う方法
ではなく、 >tm構造体を使う方法でした。
雑魚なのに、でしゃばってしまいました m(__)m
0087デフォルトの名無しさん
2005/06/11(土) 11:56:46ttp://www.plustarnet.com/aspil/Programming/c02.htm
このページを参考に、
画面に出した文字列を任意の場所で改行する"\n"を入力しても、無視されてしまいます。
"あいうえお\n"
"かきくけこ"
と入力したのに、実行すると
「あいうえおかきくけこ」と表示され、改行されないんです。
試しに\nの位置を変えてみて、
"あいう\nえお"
"かきくけこ"
という感じで設定して実行すると、
あいう
えお
と、表示された後、改行された後にある「えお」の部分が消え、最終的には
「あいうかきくけこ」
という風に、"\nえお"の部分がなかったものにされたかのような表示がされます。
改行のさせ方自体が根本的に間違っているのでしょうか?
0088デフォルトの名無しさん
2005/06/11(土) 12:00:18まずint main(void)にしろ。
話はそれからだ。
0089デフォルトの名無しさん
2005/06/11(土) 12:20:070090デフォルトの名無しさん
2005/06/11(土) 13:25:16void mainのこと言ってんだろ、88は
0091デフォルトの名無しさん
2005/06/11(土) 13:26:05参考にしたページなぞどうでもいい、それよりもオマエの書いたソースを晒せ
0092デフォルトの名無しさん
2005/06/11(土) 13:32:39{
printf("もうだめぽイェア\n");
}
0093デフォルトの名無しさん
2005/06/11(土) 16:18:02main() と同義なのは、
C: main(...)
C++: main(void)
0094デフォルトの名無しさん
2005/06/11(土) 16:53:54ありゃ、普通に改行されるけど。void mainでも同じ。
#include <stdio.h>
int main(void)
{
printf("あいうえお\n""かきくけこ");
return 0;
}
0095デフォルトの名無しさん
2005/06/11(土) 17:20:16自分で気がつかない・分からない凡ミスなんてよくあること
ソース見せなきゃ始まらない
0096デフォルトの名無しさん
2005/06/11(土) 17:23:32printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
printf("あいうえお\n""かきくけこ");
0097デフォルトの名無しさん
2005/06/11(土) 17:59:530098デフォルトの名無しさん
2005/06/11(土) 18:29:05うーん、謎だ。ここはご本人様の登場を待ちたい。
0099デフォルトの名無しさん
2005/06/11(土) 18:35:12int main(void)
{
int i;
for(i=0; i<10; i++)
printf("printf(\"あいうえお\\n\"\"かきくけこ\");\n");
return 0;
}
0100デフォルトの名無しさん
2005/06/11(土) 18:57:000101デフォルトの名無しさん
2005/06/11(土) 18:57:40ぜんぜん見ないみたいだけど、引退?
0102デフォルトの名無しさん
2005/06/11(土) 20:32:38常駐プログラムとしてではなく普通にプログラムを書いたら、
同時にアクセスされた場合にプログラムが二つ起動してしまうでしょうか?
0103102
2005/06/11(土) 20:43:40場合によるかもしれないのでもう少し詳細に書きます。
このプログラムは1つのソースファイルに書かれています。
いくつかの関数があって、ユーザの与えた引数によってswitchして呼び出す関数を変える様になっていて、
それで呼び出された関数以外はそのアクセスでは使われません。
これでもし同時アクセス時にプログラムが二つ起動するとなると、
使われない関数が多数メモリにロードされる事になるのでは無いだろうかと心配です。
0104デフォルトの名無しさん
2005/06/11(土) 20:53:21まあ聞く場所を間違えたようだな。
0105デフォルトの名無しさん
2005/06/11(土) 20:55:17char のポインタでの全角半角変換ってどうすればできます?
std::stringからcharのポインタ変換できなくて困ってます。
便利な関数なので使いたいのですが。
0106デフォルトの名無しさん
2005/06/11(土) 21:07:00もちつけ。
charのポインタに全角半角の変換機能があるなんて初耳だ。
どれが便利な関数でどうなんだ?
とりあえずstd:stringのからC文字列へのポインタが欲しければc_str()
0107デフォルトの名無しさん
2005/06/11(土) 21:20:45藻前も餅漬
0109デフォルトの名無しさん
2005/06/11(土) 22:12:48書くかを設定するコマンドってありますか?
何も気にしないでプロジェクトつくると勝手にC++仕様になっていると思うのですが。
CとC++ではクラス以外にも微妙な文法の違いがあるので、
それをいろいろ試してみたいと思いまして。
0110デフォルトの名無しさん
2005/06/11(土) 22:42:32拡張子変えれ
0111デフォルトの名無しさん
2005/06/11(土) 23:30:30手元にVC6.0が無いから詳しく説明できないが、
拡張子がcppならc++、cならcがデフォルトで選ばれるようになる。
後から変更したいのならば、ファイルのプロパティでコンパイラを選べたはず。
0113デフォルトの名無しさん
2005/06/11(土) 23:55:37例えば data[][10]={適当な文字列を複数}; と宣言して、
先頭の文字が a で始まるものだけを表示したい場合
for文とif文で表現できると思うのですがこの時for文の継続条件式は
どう書くのでしょうか?
for(i=0;文字列分<i;i++)と書いたら宣言内の文字列が変わった時に条件式も変えていくしかないのでしょうか?
長文ですみません
0114デフォルトの名無しさん
2005/06/12(日) 00:03:290115デフォルトの名無しさん
2005/06/12(日) 00:06:00forループ内でdataの内容が変わるならそういうことになるな。
その時点で設計を疑った方がいいと思うが。
後はバッファを用意するとか。
0116デフォルトの名無しさん
2005/06/12(日) 00:07:19という課題があるんですが、どうしたらいいかよくわかりません。
どなたかアドバイスをお願いします。
visual studio でCを使います。
0117デフォルトの名無しさん
2005/06/12(日) 00:09:51課題を出した人に質問する。
0119デフォルトの名無しさん
2005/06/12(日) 01:02:40>>74を見て書けばいいじゃん、と思うわけだけれども。勢いで作ってしまった
から、引数はconst std::string& hanにすべきだったなと今になって思うが。
【質問の不明確な点】
[0] OSは?
[1] Windowsだとして、>>74に直接char*を渡してはいけない理由は?
(渡せばstd::stringのコンストラクタに任せてしまえばいい)
[2] Cで書かなければならないとして、char*を返すとしたらそのメモリの確保と
解放の方法は?malloc&free?
0120デフォルトの名無しさん
2005/06/12(日) 15:00:59OSはWindowsです。
何故か直接渡せませんorz
malloc使っております。
0121>>74=>>119
2005/06/12(日) 17:25:36Cで書くとこんな感じ。参考に。
#include <windows.h>
#include <stddef.h>
#include <stdlib.h>
char* han_to_zen(const char* han) {
size_t n = LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han, -1, 0, 0);
char* buf = (char*)malloc(n);
LCMapString(GetUserDefaultLCID(), LCMAP_FULLWIDTH, han, -1, buf, n);
return buf;
}
#include <stdio.h>
int main(void) {
char* zen = han_to_zen("ゴルァ");
printf("%s", zen);
free(zen);
return 0;
}
0122デフォルトの名無しさん
2005/06/12(日) 18:48:11親切すぎに有難うございます。
お蔭様でやりたい事が出来ました。
0123デフォルトの名無しさん
2005/06/12(日) 19:22:400124デフォルトの名無しさん
2005/06/12(日) 19:46:510125121
2005/06/12(日) 19:53:190126デフォルトの名無しさん
2005/06/12(日) 22:58:440127デフォルトの名無しさん
2005/06/12(日) 22:59:28分からんぞ〜
0128デフォルトの名無しさん
2005/06/12(日) 23:12:54機能面から見ればその通り。
ただし、メモリ確保を同じように実装している保証はない。
したがって、例えばnewで得られたポインタをfreeするのは正しくない。
0129デフォルトの名無しさん
2005/06/12(日) 23:15:47効率いいんですか?
0130デフォルトの名無しさん
2005/06/12(日) 23:20:20プラットフォーム依存ならWindowsのVirtualAllocみたいにアドレスだけ予約。
0131デフォルトの名無しさん
2005/06/12(日) 23:24:51http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/545.txt
0132デフォルトの名無しさん
2005/06/12(日) 23:32:010133デフォルトの名無しさん
2005/06/12(日) 23:37:57なるほろどもです。
実装は異なっても*pとかp++とかは同じようにできるんですよね。
なんか不思議。でもないか。。。
0134デフォルトの名無しさん
2005/06/13(月) 00:15:54> どこが間違ってるんでしょうか?
藻前の頭
0135デフォルトの名無しさん
2005/06/13(月) 00:16:08それはアドレスを進めてるだけだからそんなに不思議でもないぞ
配列もポインタで操作できるし
0136デフォルトの名無しさん
2005/06/13(月) 00:54:51ってやったとき、この配列が10個って言うのを、
調べる方法は無いんですか?
別の変数で保存しておくしか無いんでしょうか?
0137デフォルトの名無しさん
2005/06/13(月) 00:55:56Yes.
0138デフォルトの名無しさん
2005/06/13(月) 00:56:39実装が違うと、同じ演算子でも呼び出すコードは違うんでしょうね。
繰り返し演算するときは、演算時間も変わってくるかもですね。
0139デフォルトの名無しさん
2005/06/13(月) 00:57:57は、速いレス恐れ入ります。ありがとうございました。
0140デフォルトの名無しさん
2005/06/13(月) 01:02:50char* str=new char[ 256];
とnewしたら
delete [ ] str;
しなさいって本に書いてますよね。
これ、delete str;ってしたら先頭の要素だけ解放されて、
残りの255個の要素はメモリリークするってことなんですか?
逆に、例えば、
int* i=new int;
:
delete [ ] i;
ってやったらまずいんでしょうか。
実行時エラーは起きないんですが。
0141デフォルトの名無しさん
2005/06/13(月) 01:05:050142デフォルトの名無しさん
2005/06/13(月) 02:51:48あれ、でも delete する時サイズ指定しなくてもいいってことは、どこかにサイズって記録されてるんじゃないの?
0143デフォルトの名無しさん
2005/06/13(月) 03:07:34環境依存
0144デフォルトの名無しさん
2005/06/13(月) 05:26:13そして、保存されていてもアプリ側から取得できるかどうかはわからない
0145デフォルトの名無しさん
2005/06/13(月) 15:06:58取得できる環境って実際あるわけ?
0146デフォルトの名無しさん
2005/06/13(月) 15:44:040147デフォルトの名無しさん
2005/06/13(月) 15:56:270148デフォルトの名無しさん
2005/06/13(月) 17:03:460149デフォルトの名無しさん
2005/06/13(月) 17:05:430150 ◆bk1IKp1NkI
NGNGprintf("\x1b[2J")
と書くと画面が消える、と書いていたのですが、実際には変な記号のようなものが表示されるだけで、消去できません。
どうすれば画面消去できるのでしょうか?
ちなみにXPを使っています。
0151デフォルトの名無しさん
2005/06/13(月) 18:04:37(teratermとか、puttyとか、poderosaとか)を使って、
localhostに接続、ログイン後、そのプログラムを動かせ。
0152デフォルトの名無しさん
2005/06/13(月) 18:05:07開発環境、動作環境などを明確に。
0153 ◆bk1IKp1NkI
NGNG0154デフォルトの名無しさん
2005/06/13(月) 18:11:31satoshiDlg.obj : error LNK2001: 外部シンボル ""protected: int __thiscall CSatoshiDlg::dangerous(int)" (?dangerous@CSatoshiDlg@@IAEHH@Z)" は未解決です
Debug/satoshi.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー
satoshi.exe - エラー 2、警告 0
と出てしまいます。何が原因なのでしょうか?
0155デフォルトの名無しさん
2005/06/13(月) 18:24:31そりゃあCSatoshiDlg::dangerous(int)が定義されてないんだわよ
さとしくん
0156デフォルトの名無しさん
2005/06/13(月) 20:16:110157151
2005/06/13(月) 20:31:29わけわからん。「telnetサービス」はMSが決めた名前だが、
不満でもあるのかい?
0158デフォルトの名無しさん
2005/06/13(月) 20:34:04「\x1b[2J NT」でぐぐれ
0159デフォルトの名無しさん
2005/06/13(月) 20:40:08printf( "ans = %f\n ",ans );
と,書いても1がでないんですが,どうやったら正しい値がでますか?
0160デフォルトの名無しさん
2005/06/13(月) 20:43:300161デフォルトの名無しさん
2005/06/13(月) 20:43:500162デフォルトの名無しさん
2005/06/13(月) 20:45:21具体的にどうぞ。
0163デフォルトの名無しさん
2005/06/13(月) 20:49:48ぱいって180じゃないんですね
どうもっす
0164デフォルトの名無しさん
2005/06/13(月) 20:57:550165デフォルトの名無しさん
2005/06/13(月) 21:01:27char command[10];
scanf("%s”, command);
if(command == "hoehoe"){hoe()}
上のプログラムで入力された文字列を比較したいのですが、うまく出来ません。
文字列の比較をするにはどうやったらよいですか?
0166デフォルトの名無しさん
2005/06/13(月) 21:07:240167デフォルトの名無しさん
2005/06/13(月) 21:09:22その時のストリームってどうやって指定するんですか?
標準出力に出力したいのですが。
0168デフォルトの名無しさん
2005/06/13(月) 21:13:38ありがとう。
標準関数使えばいいんですね。
上手くできました
0169デフォルトの名無しさん
2005/06/13(月) 21:16:11C++にwriteなんてものない。
何かのクラスのメンバじゃないか?
0170デフォルトの名無しさん
2005/06/13(月) 21:18:51データをファイルに書き込みます。
int _write( int handle, const void *buffer, unsigned int count );
↑はあるみたいよ
0171デフォルトの名無しさん
2005/06/13(月) 21:22:04非標準
0172デフォルトの名無しさん
2005/06/13(月) 21:34:39それは ostream::writeのことを言っているのか?
STLで派生先のテンプレートに隠蔽されている。
派生先のテンプレートクラスを使えばいい。
0174169
2005/06/13(月) 21:43:04○| ̄|_
0175デフォルトの名無しさん
2005/06/13(月) 21:46:45float bx=1.8;
int cx=ax*bx;
9にならないんでしょうか?(´・ω・`)
0176167
2005/06/13(月) 22:04:55これの事です。
出力バイト数を指定する機能が欲しいんです。
>>172
すみません。STLはほとんど知りません・・・
それを継承しているクラスに対してのみインタフェースを出しているからそのクラスを使え
という事でしょうか。
0177デフォルトの名無しさん
2005/06/13(月) 22:09:56cout.write("hoge", 4);のように使う。
まあ、今みたいにナル文字終端なら<<使えばいいわけだが。
0178デフォルトの名無しさん
2005/06/13(月) 22:32:58ならない。
int ax=5;
float bx=1.8;
float cx=ax*bx;
int dx=(int)cx;
0179デフォルトの名無しさん
2005/06/13(月) 22:38:21なるよ
結果の代入先の型のせいでなってないだけ
0180デフォルトの名無しさん
2005/06/13(月) 22:42:340181デフォルトの名無しさん
2005/06/13(月) 22:53:23intとfloatの内部構造が同じだと思ったら大間違い
0182デフォルトの名無しさん
2005/06/13(月) 23:21:170183デフォルトの名無しさん
2005/06/14(火) 00:08:21精度の関係なのでしょうか('_'?)
実数型とビット構造について少し調べてみます
答えてくださった方、ありがとうございました
0184デフォルトの名無しさん
2005/06/14(火) 00:14:31スタックオーバーフローおこしちゃうんですよね。
2次元配列ふたつと一次元配列ひとつmallocでメモリ確保したり、
変数にstaticつけたりしてるんですけどなかなか解決しません。
スタックオーバーフローの回避方法として何かいい方法はないでしょうか?
0185デフォルトの名無しさん
2005/06/14(火) 00:18:450186デフォルトの名無しさん
2005/06/14(火) 00:56:04コンパイルオプションでスタックを巨大に取っておくとか。
0187184
2005/06/14(火) 01:39:17再帰使ってないんですよね。よくわからなくて^^;
余裕があれば使ってみようと思います。
>>186
そんな方法があるのは知りませんでした。ちょっと調べてみます。
0188デフォルトの名無しさん
2005/06/14(火) 01:55:22全部mallocで動的確保してみ。
0189デフォルトの名無しさん
2005/06/14(火) 02:12:11再帰を使うときは、関数呼び出しだけでもスタック使いまくるから
呼び出し回数が多いとアウツになるかも試練。
呼び出し途中で落ちるなら、引数の数をなるべく減らすとか、
構造体にしてアドレスで渡すとか工夫汁。
0190デフォルトの名無しさん
2005/06/14(火) 02:14:18単純に配列のサイズ間違えちゃったりしてると、
予測不能の動きになるから、その辺もアヤシイ。
0191デフォルトの名無しさん
2005/06/14(火) 02:19:26どのタイミングでエラーになるとか調べた?
デバッガ使える?
使えなければデバッグライトとか入れてみて、
どこで落ちるのかとか調べてみ。
ウィンドウズなんかのプログラムだと、
やたらと複雑なダイアログ作りまくりのうえでループ走らせたりすると、
簡単にスタックオーバーフローになったりするが。
0192デフォルトの名無しさん
2005/06/14(火) 02:21:070193デフォルトの名無しさん
2005/06/14(火) 12:28:13メモリリークしまくりそうで怖ひ。
0194デフォルトの名無しさん
2005/06/14(火) 13:22:25あるとすれば、例えばどういったことをしている場合が考えられるでしょうか。
c++はcの機能を内包してるんじゃないのでしょうか。
0195デフォルトの名無しさん
2005/06/14(火) 13:38:52まず変数・関数名にC++のキーワードを使っていたら駄目だな。
あとC++はCよりも型に対するチェックが厳しくなっている。例えばvoid *からその他のポインタへの変換はC++ではキャスト(static_cast)が必要。
C99とは互換性がないのでこれもアウト。(inlineとかC++由来の機能は平気だが)
詳しくはX3014の最後の方にCとの互換性のなくなったものが理由付きで一覧になっている。
0196デフォルトの名無しさん
2005/06/14(火) 14:43:59std::endlやstd::endsなど
関数なのに括弧なしで呼び出すことが出来るのは
なぜですか?
std::strstream str;
str << "hoge" << std::endl; // ←コレ
同じように引数をとらない関数を括弧なしで呼び出したいんですが・・。
0197デフォルトの名無しさん
2005/06/14(火) 14:54:19その式で直接呼び出されているのはstd::endlではなくてstd::ostream::operator<<(ostream &(*)(ostream &))。
この関数にstd::endlへのポインタを渡している。
0198デフォルトの名無しさん
2005/06/14(火) 15:00:12strstreamは古い。stringstreamを使え。
0199デフォルトの名無しさん
2005/06/14(火) 15:43:27わかりました。
ありがとうございました。
0200デフォルトの名無しさん
2005/06/14(火) 16:11:40std::endlなんかは関数ではなくて関数オブジェクトというモノ
その構文が納得行かなければ「関数オブジェクト」と
「オペレーターオーバーロード」でぐぐってみ
0201デフォルトの名無しさん
2005/06/14(火) 16:18:35関数だよ。
>>197に書いてある通りostreamは関数へのポインタを受け取る。
関数⊆関数オブジェクトではあるが。
0202デフォルトの名無しさん
2005/06/14(火) 16:33:420203デフォルトの名無しさん
2005/06/14(火) 17:51:53実行環境はlinuxなのですが、
プログラムを何度か実行しながら時折vmstatでメモリ残量を確認してみても
メモリ残量が増えたり減ったりしていて参考になりそうに無いです。
0204デフォルトの名無しさん
2005/06/14(火) 18:31:47つvalgrind
0205デフォルトの名無しさん
2005/06/14(火) 18:47:340206デフォルトの名無しさん
2005/06/14(火) 18:50:38おk
0207デフォルトの名無しさん
2005/06/14(火) 18:53:260208デフォルトの名無しさん
2005/06/14(火) 22:05:19どう書けばよいのですか?
typedef struct {
char a;
long b;
} STest;
0209デフォルトの名無しさん
2005/06/14(火) 22:08:12C++なんだから構造体タグ名だとかtypedefだとかいうCの慣習は
不要であって、
たんに
struct STest {
char a;
long b;
};
と書けばよい
無論コンストラクタは STest()ね。
0210デフォルトの名無しさん
2005/06/14(火) 22:48:55やっぱそうですか。そうします。
0211デフォルトの名無しさん
2005/06/15(水) 00:39:51よけいなお節介だが、C++でのstructとclassの差って分かってるよね?
基本的に
structのメンバのデフォルトがpublic、classはデフォルトがprivate
の差でしかない。
0212デフォルトの名無しさん
2005/06/15(水) 00:44:530213デフォルトの名無しさん
2005/06/15(水) 00:55:16自動変数で、
double d[100];
の配列を一気にすべての要素を0.0に初期化する方法ってありませんか。
int d[100]={0.0,0.0,0.0,, ,,0.0};
っていうのは面倒で間違えそうなので。
初期化のたびにforループで回すのもなんだかなーって思うんです。
0214デフォルトの名無しさん
2005/06/15(水) 00:58:150215デフォルトの名無しさん
2005/06/15(水) 00:58:540216デフォルトの名無しさん
2005/06/15(水) 02:04:55>>214
それってC++標準なのでしょうか。
VC++6.0だと先頭の要素しか0にならなかったもので...orz
何か間違ったかな。。。
>>215
それはやったことが無いのでためしてみますです。
0217デフォルトの名無しさん
2005/06/15(水) 05:23:30structに関数が入れられるというのか・・・
0218デフォルトの名無しさん
2005/06/15(水) 05:52:47C++なら普通にメンバ関数もてるが?
0219デフォルトの名無しさん
2005/06/15(水) 06:53:500220名無しさん@お腹いっぱい。
2005/06/15(水) 11:41:45test.c: 関数 `main' 内:
test.c:23: 警告: 互換性のないポインタ型からの引数 1 個の `mat_add' を渡しますです
test.c:23: 警告: 互換性のないポインタ型からの引数 2 個の `mat_add' を渡しますです
とエラーが出ます。原因が解かる方お願いします。
#include <stdio.h>
/*--- 2行3列の行列maとmbの和をmcに格納する ---*/
void mat_add(const int ma[2][3], const int mb[2][3], int mc[2][3])
{
int i, j;
for (i = 0; i < 2; i++)
for (j = 0; j < 3; j++)
mc[i][j] = ma[i][j] + mb[i][j];
}
int main(void)
{
int i, j;
int ma[2][3] = { {1, 2, 3}, {4, 5, 6} };
int mb[2][3] = { {6, 3, 4}, {5, 1, 2} };
int mc[2][3] = { 0 };
mat_add(ma, mb, mc);
for (i = 0; i < 2; i++) {
for (j = 0; j < 3; j++)
printf("%3d", mc[i][j]);
putchar('\n');
}
return (0);
}
0221デフォルトの名無しさん
2005/06/15(水) 11:46:20int (*)[3]からconst int (*)[3]には安全に変換できない。
0222220
2005/06/15(水) 11:50:53有難うございます。
constを外して以下のようにしたらコンパイルできました。
void mat_add(int ma[2][3], int mb[2][3], int mc[2][3])
0223221
2005/06/15(水) 11:54:59安全性をgccが認識していないということか。
まあ、c++ではエラーだから妥当な警告だと思うが。
0224デフォルトの名無しさん
2005/06/15(水) 11:57:59すげー訳だな。
0225デフォルトの名無しさん
2005/06/15(水) 13:09:204バイトのint8個の配列を作っても、
int a[8];
a = a & 0x3333333333333333333333333333333333333333333333333333333333333333;
というコードはエラーになってしまうし、
この論理積は単調だからループ処理で4バイトずつ行う事も出来るけど、単調でない場合はかなり面倒です。
0226デフォルトの名無しさん
2005/06/15(水) 13:11:49な に を し た い ん だ
そもそも普通はchar a[32]だろ。
0228デフォルトの名無しさん
2005/06/15(水) 13:28:54多倍長整数を扱えるライブラリを使うか、自分で実装する。
0229デフォルトの名無しさん
2005/06/15(水) 13:40:44素直に16進ダンプ文字列とのビット演算するロジックを書けばいいのでは?
0230デフォルトの名無しさん
2005/06/15(水) 13:47:22int a[8];
int count = 0;
int i;
for( i=0; i<sizeof(a)/sizeof(a[0]); i++ )
{
count = countbit( a[i] );
}
として、countbit()を実装すればいいだけでは?
0233デフォルトの名無しさん
2005/06/15(水) 22:18:22C言語とかで
(0==hoge)? 10: 20;
とかの判定?について調べたいのですが、これはどういう命令になるのでしょうか?
WEBの検索キーワードは何と入力したら…
0234デフォルトの名無しさん
2005/06/15(水) 22:32:08条件演算子。
単項・2項演算子と違い3項演算子は条件演算子しか存在しないので条件演算子のことを指して3項演算子とも言われる。
その場合0がhogeなら10、そうでなければ20となる。
こういう風に自然に読むと妙な文章になるからhoge == 0と書け。
0235デフォルトの名無しさん
2005/06/15(水) 22:36:58ぐはっ!すぐに引っかかった!
しかも見てたサイトで…(涙)
ありがとうございました。
精進します…
0236デフォルトの名無しさん
2005/06/15(水) 23:53:57int型4バイトの整数7777777というものがあったとします。
そしてこれをファイルに書き込もうと、fwrite関数を使ったりしようとすると
整数7777777を文字としなければならず
そうして書き込むと'7'が7個分の7バイトとして書き込まれてしまいます。
この7777777という4バイトの整数値を、ファイルに書き込むときになんとか
4バイトで書き込む方法はないでしょうか?
0237デフォルトの名無しさん
2005/06/16(木) 00:00:30fprintfで書き込むと文字としての7777777になるけどfwriteで書き込めばsizeof (int)、お前の言う4バイトで書き込まれると思うが。
0238236
2005/06/16(木) 00:12:18どうすればいいのかわからないです・・・
int num = 7777777;
としたときにこの値をファイルに4バイトで書き込むにはどうしたらいいのでしょう。
fwrite(num,sizeof(int),1,ファイルポインタ)
とするとエラーがでますし
numを文字配列に char *buf = "7777777";
のようにして
fwrite(buf,sizeof(int),1,ファイルポインタ)
とやってもうまくいきません・・・
0239デフォルトの名無しさん
2005/06/16(木) 00:16:17○ : fwrite(&num,sizeof(int),1,ファイルポインタ);
0241デフォルトの名無しさん
2005/06/16(木) 01:57:05for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
a[N * i + j] = 右辺;
}
}
って書いてるコードがあるんですが、このa[N * i + j]って
a[i][j]と同じであってます?
0242デフォルトの名無しさん
2005/06/16(木) 01:59:57Cには配列の配列しかないんだが
とりあえず a[N * i + j] は違うな
0243デフォルトの名無しさん
2005/06/16(木) 02:09:30うぉ 質問しようとしたことがそのままかかれとる。
結局ansi.sysはさほど意味がなかったのねorz
0244デフォルトの名無しさん
2005/06/16(木) 02:10:08違うと言うのは?
Cの参考書に書いてあるコードなので、100%とは言いませんが、ある程度信頼できるかと思うのですが。
0245デフォルトの名無しさん
2005/06/16(木) 02:13:100246デフォルトの名無しさん
2005/06/16(木) 02:20:42aの型が double * ならそのコードで正しい
aの型が double (*) [N] なら間違い
double [N][N]の配列を指すポインタの型は本来 double (*) [N]だ。
だから、aの型が double * なら、double[N][N]の二次元配列を指すには
キャストが必要になる。
ま、たまたまCの二次元配列のレイアウトはそうなってるから、
キャストして、そのコードのように一次元配列のように扱うこともできる。
0247デフォルトの名無しさん
2005/06/16(木) 07:26:57それって標準でそうなってるの?
0248デフォルトの名無しさん
2005/06/16(木) 11:10:02Cの所謂二次元配列は配列の配列でしかないから必然的にそう為らざるを得ないね。
0249デフォルトの名無しさん
2005/06/16(木) 15:03:05// Timeクラスの定義
// メンバ関数はTIME.CPPの中で定義
// ヘッダファイルを重複してインクルードするのを防ぐ
#ifndef TIME1_H
#define TIME1_H
// 抽象データ型(ADT)Timeの定義
class Time {
public:
Time(); // コンストラクタ
void setTime(int, int, int); // 時,分,秒を設定する
void printMilitary(); // 軍事形式で時刻をプリントする
void printStandard(); // 標準形式で時刻をプリントする
private:
int hour; // 0〜23
int minute; // 0〜59
int second; // 0〜59
};
#endif
↑コンパイル出来ましぇん(T_T)
宣言の構文エラーとか表示されます
0250デフォルトの名無しさん
2005/06/16(木) 15:17:23コンパイルした方法とエラー内容を正確に示そう
0251デフォルトの名無しさん
2005/06/16(木) 15:18:090252デフォルトの名無しさん
2005/06/16(木) 15:22:11ボーランドのコンパイラを使っております
上のファイルをコンパイルしたところ
「宣言の構文エラー」でコンパイルに失敗しました
どうやらエラー箇所は「class Time{」
という行にあるみたいです.
>>250
確かに他でTimeが宣言されていますが,
名前を全く違うものに変更しても同じエラーが発生しました
0253デフォルトの名無しさん
2005/06/16(木) 15:26:15か。
bcc time1.h
とかしてないよね?
0254デフォルトの名無しさん
2005/06/16(木) 15:29:22コンパイルはアプリケーションまかせなので・・・
どうやら間違った方法のようですね
正しい方法を教えてくださいm(_ _)m
0255デフォルトの名無しさん
2005/06/16(木) 15:38:380256デフォルトの名無しさん
2005/06/16(木) 15:41:44これじゃ駄目なんですか??
0257デフォルトの名無しさん
2005/06/16(木) 15:46:33//めんどくせぇからこれをfoo.cppとしてbcc foo.cppしろ。
#include "time1.h"
0258デフォルトの名無しさん
2005/06/16(木) 15:54:03確かにC++Builderとあるのに・・・
0259デフォルトの名無しさん
2005/06/16(木) 15:55:07>>257
0260デフォルトの名無しさん
2005/06/16(木) 15:57:180261デフォルトの名無しさん
2005/06/16(木) 16:02:55そうなんですか!?
全然知らなかった・・・
今度は先ほどのtime1.hをインクルードしたプログラムを作ったのですが(time1.cpp)
これをコンパイルすると
外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
というエラーが発生しました.
main関数は絶対必要なんですか??
time1.cppの中にはmain関数はないのですが・・・
0262デフォルトの名無しさん
2005/06/16(木) 16:04:310263デフォルトの名無しさん
2005/06/16(木) 16:10:13ここはC++の勉強を一方的に教える諸サイトと違って
インタラクティブに解決できると思ったのに・・・
参考書に書いてある通りにしてできないものをどう調べろと??
調べてもいいけど、これってC++の文法云々じゃない気がする
0264デフォルトの名無しさん
2005/06/16(木) 16:11:04初心者歓迎なんだから、それはさすがに言いすぎ。
>>261
exeファイルを作りたいなら、main関数は必要だよ。
でないと、どこから実行したらいいかわからないからね。
0265デフォルトの名無しさん
2005/06/16(木) 16:14:25おい待てコラ
>>249でヘッダのコメントに書いてある
// メンバ関数はTIME.CPPの中で定義
はどうしたんだよ
わざわざ新しくtime1.cppなんて作らんでも、上記のTIME.CPP使えばええじゃないか
0266デフォルトの名無しさん
2005/06/16(木) 16:17:090267デフォルトの名無しさん
2005/06/16(木) 16:17:23構造的には
time1.hというヘッダファイルがあって
time1.cppというプログラムがtime1.hをインクルードしてて(ここで実装している)
list06_05.cppというプログラムがドライバとしてテストしている(ここにmain関数あり)
というものです。
list06_05.cppを実行しようとすると,Timeという型が理解できないと言われたので
やはり原因は
>>249
のプログラムにあると思ったのですがいかがなもんでしょう??
0268デフォルトの名無しさん
2005/06/16(木) 16:21:16list_06_05.cppではinclude "time1.h"してる?
0269デフォルトの名無しさん
2005/06/16(木) 16:26:59( ; ° °)
どうやら"time1.h"を"time.h"にしてたようですm(_ _)m
それでもまだ動きません。
list_06_05.cppに
「注意: TIME1.CPPと一緒にコンパイルすること」
とあるのですが,ひょっとしたらこれかもと今ふと思いました。
ひょっとして同時にコンパイルとかも可能なんですか??
0270デフォルトの名無しさん
2005/06/16(木) 16:27:46最初からこの内容で質問しろ。
>list06_05.cppを実行しようとすると,Timeという型が理解できないと言われたので
>やはり原因は
>>>249
>のプログラムにあると思ったのですがいかがなもんでしょう??
大間違い。初心者が正確な判断できるわけ無いのだから自分の判断で情報を小出しにしないこと。
>>268に加え、list06_05.cppとtime1.cppを同時にコンパイルして実行ファイルを作らせたらいいはず。
0271デフォルトの名無しさん
2005/06/16(木) 16:28:46>list_06_05.cppに
>「注意: TIME1.CPPと一緒にコンパイルすること」
>とあるのですが,ひょっとしたらこれかもと今ふと思いました。
おまえ馬鹿だろう。
0272デフォルトの名無しさん
2005/06/16(木) 16:32:29馬鹿ですね。
でも一緒にコンパイルするなんてこと分からなかったから
仕方ないじゃないですか(言い訳)
みんな厳しいけどいい人ばっかやね。
0273デフォルトの名無しさん
2005/06/16(木) 16:35:16仕方が無いなんて無い
0274デフォルトの名無しさん
2005/06/16(木) 16:42:49それを思いっきり無視して自分の思い込みだけで対処しようとするところが
馬鹿なの。
0275デフォルトの名無しさん
2005/06/16(木) 17:11:12っ[ -P -c ]
0276超初心者
2005/06/16(木) 18:12:10わからなかったので、質問させてください。
「C言語による、外部ファイルへの出力方法を調べろ」と言われたのですが
外部ファイルすらよくわからず、どなたか説明できないでしょうか。。
勉強不足ですみません。
0277デフォルトの名無しさん
2005/06/16(木) 18:16:210278デフォルトの名無しさん
2005/06/16(木) 18:21:26OSのファイルシステム上に存在するファイルって意味じゃないか?
平たく言えばごく普通のファイル。
0279超初心者
2005/06/16(木) 18:28:51すみません。。
>>278
ありがとうございます!けれど、外部ファイルのことはわかった
のですが、出力方法というのがいまいちぴんとこないのですが
お教えいただけないでしょうか。。?
0280デフォルトの名無しさん
2005/06/16(木) 18:29:43fopenでファイルを開いてfprintfで書き出してfcloseで閉じる。
こんな流れ。
0281デフォルトの名無しさん
2005/06/16(木) 18:35:260282デフォルトの名無しさん
2005/06/16(木) 18:35:570283デフォルトの名無しさん
2005/06/16(木) 18:36:08>>276
>「C言語による、外部ファイルへの出力方法を調べろ」
0284デフォルトの名無しさん
2005/06/16(木) 22:09:17#include <stdio.h>
int main()
{
double a,b,c,x,y;
scanf("%lf",&a);
scanf("%lf",&b);
scanf("%lf",&c);
scanf("%lf",&x);
y = (c-(a*x))/b;
printf("%lf\n",y);
return 0;
}
b!=0でないという条件がある場合どのように書き加えたらよろしいでしょうか?
また
a1*x + b1*y = c1
a2*x + b2*y = c2
のx,yを求めるプログラムを作る場合の
x,yの求め方を教えていただきたいです。
これも条件があって
a1*b2 != a2*b1
になります
0285デフォルトの名無しさん
2005/06/16(木) 22:14:33>b!=0でないという条件がある場合
何の条件だ?
入力にその条件を期待してよいと言うことなら、コードに変更の必要はない。
0286AA
2005/06/16(木) 22:57:55押された文字が取得できるようにするにはどうしたらいいんでしょうか?
聞くところによるとフックという物を使うそうなのですが...
それが用わかりません。
0287デフォルトの名無しさん
2005/06/16(木) 23:07:50http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm
0288デフォルトの名無しさん
2005/06/16(木) 23:52:51{
char a,b;
scanf("%d",&a);
printf("%d\n\n",a);
scanf("%d",&b);
printf("%d\n",b);
printf("%d",a); ←ここでaが0になるんだけどなんででしょうか?
printf("%d\n",a+b);
}
0289デフォルトの名無しさん
2005/06/16(木) 23:56:50これこれ、scanf()に"%d"と指定しておきながらcharのアドレスを渡しちゃ
いかん。scanf()はその書式指定を信じて、そのアドレスからsizeof(int)分の
領域に書き込むからメモリが壊れるぞ。
一方、printf()に渡すのはかまわんがな。
0290デフォルトの名無しさん
2005/06/16(木) 23:57:26>scanf("%d",&b);
この段階で、aを壊している。
当然、scanf("%d",&a); もダメ。
charに代入したいなら一旦intで受けてからコピーすべし。
0292デフォルトの名無しさん
2005/06/17(金) 00:15:39連立方程式を解く機械的な方法を考えて、その通りに実行するプログラムを書くだけ。
0293デフォルトの名無しさん
2005/06/17(金) 00:27:29?個、交互においてあります。
このファイル自体のサイズは調べずに?個の100バイトの固まりを
ファイル内からすべて取り出しなさい。
とあったので以下のようにすると永遠に動き続けてしまいます。
一体何処が悪いのでしょう?
100バイト
500バイト
100バイト
500バイト
・
・
・
100バイト
500バイト
main(){
FILE *fp = fopen("souko","rb");
char buf[200];
int total = 0;
while(feof(fp) == 0){
fread(buf,100,1,fp);
total++;
bufの中身クリア;
fseek(fp.500,SEEK_CUR)
} //無限ループになってしまう
0294デフォルトの名無しさん
2005/06/17(金) 00:28:200295デフォルトの名無しさん
2005/06/17(金) 00:33:33>fseek(fp.500,SEEK_CUR)
これは何のジョークかね?
fseek(fp, 500, SEEK_CUR);
の間違いだよなもちろん。
で、feof()だけじゃなくferror()もチェックしたらどうよ。
0296デフォルトの名無しさん
2005/06/17(金) 00:33:57まだ人類が負けたと決まったわけでは無い。
0297デフォルトの名無しさん
2005/06/17(金) 00:37:08fread()の戻り値をチェックせよ。
0298デフォルトの名無しさん
2005/06/17(金) 00:38:57fseekを行うとeofが返ってこなくなるよ。
0299デフォルトの名無しさん
2005/06/17(金) 00:41:59大阪では3台撃墜したらしいしな
0300デフォルトの名無しさん
2005/06/17(金) 00:51:32http://www.mozilla-japan.org/hacking/portable-cpp.html
この文書は古いから、移植性の高いコードを書く時も、
ここに書いてあること全部無視してもいいんですよね?
0301デフォルトの名無しさん
2005/06/17(金) 00:57:33どれぐらいのポータビリティが必要かによるだろ
Cで本気でポータビリティを求めるなら(未だに)K&Rスタイルで書くか、
ansi2knr.cを添付するかしなきゃいかんワケだし
一方、(たとえば)boostは十分ポータブルだと考えるなら、そこの
記述の多くは古くて無視可能なものだろうな
0302デフォルトの名無しさん
2005/06/17(金) 00:58:030303デフォルトの名無しさん
2005/06/17(金) 01:00:33そうでもない。
0304デフォルトの名無しさん
2005/06/17(金) 01:57:10DOS窓に計算結果や文字が表示されたりするだけのプログラムを作るだけで終わってしまいました。
Windowsアプリやimodeのアプリ、Perlを使った掲示板等を作ってみたいのですが、一体自分は今
どのあたりまで到達しているのでしょうか?100%中10%位?
500ページもある本を二冊も読んだのにDOS窓の中で動くプログラムしか作れない現実に絶望気味ですorz
0305デフォルトの名無しさん
2005/06/17(金) 01:59:34なに目指すかによるね。
0306デフォルトの名無しさん
2005/06/17(金) 02:03:080307デフォルトの名無しさん
2005/06/17(金) 02:05:04ようやくパーセンテージが付けられるようになった状態。つまり0%。
0308デフォルトの名無しさん
2005/06/17(金) 02:06:00永遠に終わらぬではないか。
0309デフォルトの名無しさん
2005/06/17(金) 02:07:07環境非依存の内容が終わったところだったら、まだ出発点じゃない?
0310デフォルトの名無しさん
2005/06/17(金) 02:07:4840%〜50%くらい?ちょっと甘いかな。
0311デフォルトの名無しさん
2005/06/17(金) 02:11:39環境非依存ってなんですか?
>>310
0%と40%じゃえらく違うな・・・。
もう半分は来ているのか。
0312デフォルトの名無しさん
2005/06/17(金) 02:15:24C++コンパイラが書けたら100%っていうんならべつに
Windowsプログラミングの知識なんぞ要らないぞ
0313デフォルトの名無しさん
2005/06/17(金) 02:17:51難しくて自分で説明ができません。
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b)
{
int tmp;
tmp = *a, *a = *b, *b = tmp;
}
void random_shuffle(int *start, int *last)
{
int *next = start;
size_t index;
for (index = 2; ++next != last; ++index)
swap(next, start + (rand() % index));
}
main()
{
int i;
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
srand(0);
random_shuffle(array, array+10);
for (i = 0; i < 10; ++i)
printf("%d\n", array[i]);
}
の
0314デフォルトの名無しさん
2005/06/17(金) 02:18:05int *next = start;
size_t index;
for (index = 2; ++next != last; ++index)
swap(next, start + (rand() % index));
}
と
int i;
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
srand(0);
random_shuffle(array, array+10);
for (i = 0; i < 10; ++i)
がわからないのですがどういうことなのでしょうか?
とくに配列のarrayの使い方とindexがよくわかりません
0315デフォルトの名無しさん
2005/06/17(金) 02:18:200316デフォルトの名無しさん
2005/06/17(金) 02:20:45>>306
馬鹿。
0317デフォルトの名無しさん
2005/06/17(金) 02:23:37音を出したりする位のことは簡単にできるんじゃないのかと思っていたのですが
1000ページ読んで出てきたのは文字と\a記号のビープ音orz
どうやったら文字とビープ音だけの世界から抜けられるのでしょうかorz
0318デフォルトの名無しさん
2005/06/17(金) 02:25:15一つ目には1、二つ目には2とはいってますにゃ。
それをぐちゃぐちゃっと。
0319デフォルトの名無しさん
2005/06/17(金) 02:27:55絵に描いて考えろ。話はそれからだ。
こんな夜中に釣られるテシト
0320デフォルトの名無しさん
2005/06/17(金) 02:31:43マジレスすると開発環境買って来い。
VCでもBCBでもいいから。
0321デフォルトの名無しさん
2005/06/17(金) 02:32:371000ページ勉強したことは開発環境を使う上で無駄にはならんから安心しろ。
0322デフォルトの名無しさん
2005/06/17(金) 02:35:41MSのVC++2005Expressならありますが・・・これじゃだめ?
ただで配るなんてMSも腹が太い。
0323デフォルトの名無しさん
2005/06/17(金) 02:38:26とりあえず勉強にはそれでいいから、次はGUIの勉強をしなさい。
0324284
2005/06/17(金) 02:42:19a1*x + b1*y = c1
a2*x + b2*y = c2
の連立方程式のx,yを導き出す方法が思いつきません
どのようにx =
y =
とすればよいのでしょうか・・・
よろしければご教授いただければと思います。
0325デフォルトの名無しさん
2005/06/17(金) 02:44:22それ中学校の数学
著しくスレ違い&板違い
自分でなんとかしろ
0326デフォルトの名無しさん
2005/06/17(金) 02:47:40random_shuffle()の中で、
1) nextポインタはstartが指す配列の1, ... 9番目という具合に動く。
2) indexは、2, 3, ... 10の範囲を動く。
3) rand() % indexの結果は、
0〜1, 0〜2, 0〜3... 0〜9
の範囲を動く。
4) そして、swap()によって、配列の
1番目と、0〜1番目のいずれか
2番目と、0〜2番目のいずれか
3番目と、0〜3番目のいずれか
:
を交換している。これで、配列の要素を「シャッフル」しているわけだ。
arrayの使い方がよくわからないってのは、よくわからないな。
int array[] = { 1, 2, ... };
は、要素数10コのintの配列を宣言すると同時に初期化している。
random_shuffle()の呼び出しでは、配列の先頭のポインタと、配列の末尾
を一個超えたポインタを、終端として渡している。これはたまたま、
random_shuffle()が、そういう風に作ってあるからだ。
0327313
2005/06/17(金) 03:52:56そこまではなんとかわかります。
10個の箱があってそれぞれに1〜10までの数値が入っていてそれをごちゃ混ぜにしたのを
頭から表示させているんですよね?
いま悩んでいるのは、このプログラムを構成している途中経過を説明するように言われて
これをどう説明すればいいのかわからなくて困っているのです。
わかりにくい書き方をして申し訳ありませんでした
0328313
2005/06/17(金) 04:02:53詳しい説明ありがとうございます!
授業でポインタは「うまく説明できないから」と飛ばされてしまったのでよくわかっていなかったのと、
授業で配られた資料のなかにarrayに関するものがなかったので理解に困っていました。
0329デフォルトの名無しさん
2005/06/17(金) 09:47:26どんな授業だよw
0330デフォルトの名無しさん
2005/06/17(金) 09:52:17大学や専門学校の授業の平均像なんてこんなもんだ。
0331デフォルトの名無しさん
2005/06/17(金) 09:54:36大学もかよ(w
0332デフォルトの名無しさん
2005/06/17(金) 09:54:410333デフォルトの名無しさん
2005/06/17(金) 09:58:19デフォルトのコントロールのフォントはMS Pゴシックですよね。
これだと韓国語や中国語は表示できません。
で、フォントをArialにすると、韓国語や中国語、日本語やその他の言語も表示できたんですが、
Arialって文字コード表で見ると日本語や韓国語などは含まれていません。
なのになぜ表示できるんでしょうか。
同じようにMSPゴシックには韓国語は含まれていないのですが、Arialとの違いは何なのでしょうか。
また、フォントにない文字はおそらく他のフォントが割り当てられているのでしょうが、そのフォントは何なんでしょうか。
0334デフォルトの名無しさん
2005/06/17(金) 10:11:310335デフォルトの名無しさん
2005/06/17(金) 11:10:35うちの大学なんか、ソースコードをサブディスプレイに表示して
教授眠くなるような口調で延々と読み上げるだけだったぞw
説明一切なしで、学科の80%の人間は理解不能。
FDDでコピーがあたりまえだった。
もうねアホかとバカかと小一時間問いつめたくなったね。
ワープロの講義だろこれ。と。
0336333
2005/06/17(金) 12:36:41ありがとう。助かりました。
0338デフォルトの名無しさん
2005/06/17(金) 14:07:26おもにWisdomSoftのC言語入門を参考に、猫でもも見てCの勉強はじめたのですが
ファイルサイズの取得方法が解りません。
バッファ式とでもいうのでしょうか? 数バイトづつの読み書きは説明もあり解るので
すが、読み込みたいファイルに合わせてメモリ確保したいのです。
0339デフォルトの名無しさん
2005/06/17(金) 14:33:110340デフォルトの名無しさん
2005/06/17(金) 14:38:43ファイルサイズを取得する方法は幾つかあるが、完全に移植性のある方法は(現実的な範囲では)ない。
・標準関数を使う方法
fopen()してfseek()で末尾に移動、ftell()でオフセットを得る。
・stat()を使う方法
Windowsだと_stat()かな? fstat()でもいいかもしれない。
・APIを使う方法
GetFileSize()
尚、2GBを超えるサイズのファイルの場合はこれらの手法が使えないので注意。
0341デフォルトの名無しさん
2005/06/17(金) 15:04:42標準関数にはGetFileSize()のようなのはないのですね。
アセンブラで書いたものをCではどうやるのか勉強していまして、
質問させて頂きました。
stat()というのは知らないので勉強して決めたいと思います。
ありがとうございました。
0342デフォルトの名無しさん
2005/06/17(金) 15:13:22>ポインタは「うまく説明できないから」
これはなかなか至言だ
0343デフォルトの名無しさん
2005/06/17(金) 15:16:06詐欺だよな。あれは。
大学というのは資格ビジネスなのか所詮・・・。
0344デフォルトの名無しさん
2005/06/17(金) 15:19:13GetFileSize()は2GB超もいけるだろ。
まぁ、どのみち32bit版Windowsで2GB超のファイルを一気にメモリ上に取り込むこと自体不可能に近いが。
2GB未満でもバカでかいファイルを一気にメモリに読み込むのは阿呆だけどな。
まぁCreateFileMapping()とかあるが。
0345デフォルトの名無しさん
2005/06/17(金) 15:46:38ここWin限定とかじゃないから、Win32APIと書いた方がいい気がするが。
0346ham
2005/06/17(金) 16:41:22質問,下記をコンパイルすると最初の関数宣言
”void max(int study[][SUB],int STU);”でエラーになります。
なぜですか?教えて下さい。
0347デフォルトの名無しさん
2005/06/17(金) 16:43:32エラーメッセージを書くこと。
以上。
はい、次。
0348ham
2005/06/17(金) 16:45:45#include <stdio.h>
#define SUB 3 /*科目*/
#define STU 5 /*生徒人数*/
void max(int study[][SUB],int STU);
void average(int study[][SUB],int STU);
int main(void)
{
int study[STU][SUB];
int i,j;
puts("点数を入力してください。");
for(i=0; i<STU; i++){
for(j=0; j<SUB; j++){
printf("生徒 No%d",i+1);
switch (j){
case 0 : printf("国語"); break;
case 1 : printf("数学"); break;
case 2 : printf("英語"); break;
}
scanf("%d",&study[i][j]);
}
}
average(study,STU);
max(study,STU);
return 0;
}
0349ham
2005/06/17(金) 16:47:00/*平均点*/
void average(int study[][SUB], int STU)
{
int i;
int l,m,e;
for(i=0; i<STU; i++){
l+=STU[i][0];
m+=STU[i][1];
e+=STU[i][2];
}
printf("国語の平均 %d\n",l/STU);
printf("数学の平均 %d\n",m/STU);
printf("英語の平均 %d\n",e/STU);
}
0350ham
2005/06/17(金) 16:47:20void max(int study[][SUB],int STU)
{
int i,j;
int l_max,m_max,e_max;
l_max=m_max=e_max=study[0][0];
for(i=0; i<SUB; i++){
for(j=0; j<STU; j++){
if(i==0 && l_max<study[i][j])
l_max=study[i][j];
if(i==1 && m_max<study[i][j])
m_max=study[i][j];
if(i==2 && e_max<study[i][j])
e_max=study[i][j];
}
}
printf("国語の最高 %d\n",l_max);
printf("数学の最高 %d\n",m_max);
printf("英語の最高 %d\n",e_max);
}
0351ham
2005/06/17(金) 16:48:51コンパイルすると
error C2143: 構文エラー : ')' が 'constant' の前に必要です。
C:\Documents and Settings\mol\mols\lesson1\baka2.cpp(5) : error C2143: 構文エラー : ';' が 'constant' の前に必要です。
C:\Documents and Settings\mol\mols\lesson1\baka2.cpp(5) : fatal error C1004: 予期せぬ EOF が検出されました
と表示されます。
0352デフォルトの名無しさん
2005/06/17(金) 16:49:530353デフォルトの名無しさん
2005/06/17(金) 16:50:06STUがdefine定数だから、
void max(..., int STU);
は展開されて
void max(..., int 5);
になる。よって、エラー。
以上。
はい、次。
0354ham
2005/06/17(金) 17:19:33ですが判りません。すいません。
引数のSTUがdefine定数で5じゃダメなんですか?
展開のことをもう少し追加説明をよろしくお願いします。
0355デフォルトの名無しさん
2005/06/17(金) 17:34:26駄目、駄目。
STUがどうのではなく
int hoge としたら hogeは未定義の名前でなければならない。
即ち宣言なんだが。
コンパイラが解釈する前に展開される。
この場合の展開は置換のようなもの。
コンパイラは5という定数は変数に使えないからエラーにしている。
0356デフォルトの名無しさん
2005/06/17(金) 17:45:08サイトないですか?
0357デフォルトの名無しさん
2005/06/17(金) 17:45:310358ham
2005/06/17(金) 17:46:42丁重にありがとうございました。
0359デフォルトの名無しさん
2005/06/17(金) 18:07:170360デフォルトの名無しさん
2005/06/17(金) 18:16:460361デフォルトの名無しさん
2005/06/17(金) 18:20:38二次方程式を解くアルゴリズムが思いつかないってことか?
掃き出し法でググれ
0362361
2005/06/17(金) 18:22:180363デフォルトの名無しさん
2005/06/17(金) 20:53:420364デフォルトの名無しさん
2005/06/17(金) 20:55:45右シフトしてみたりMTを使ってみたりする。
0365デフォルトの名無しさん
2005/06/17(金) 21:01:33右シフトして意味あるの? underflow起こしたり、有効桁数がなくなるだけじゃない?
0366デフォルトの名無しさん
2005/06/17(金) 21:07:46大体の擬似乱数は下位ビットの精度が悪いことが多い。
0367デフォルトの名無しさん
2005/06/17(金) 21:19:07とりあえず環境/実装系依存でない程度の話なら、
CFAQ参照
ttp://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/c/C-faq/C-faq-13.html
の13.16だ。
0368デフォルトの名無しさん
2005/06/17(金) 22:03:49見ました
ちょっとイジってみたんですけど、ちょっとマシになったくらいかな?って感じです
まだ初心者の身分なんで、あまりに難しそうなところは飛ばして読んだんですが、助かりました
0369デフォルトの名無しさん
2005/06/17(金) 23:29:06SNESの音楽データフォーマット、SPCファイルにかかれている
ID666の情報を取得して、リストとして表示するプログラムを考えています。
ID666におけるヘッダ情報はいろんなサイトを巡って見つけたのですが、
曲名に当たる部分が32バイトしかありません。
中には32バイト以上の曲名も存在します。
そのようなSPCファイルをWinampで読み込ませてみたところ、きちんと曲名が表示されています。
しかしID666における曲名該当部分には、曲名の途中までしか入っていません。
このような曲名が長い場合、どこに曲名がかかれているのか、
また、どうやって曲名が長いファイルを自動選別できるか、
よろしければご教授おねがいします。
開発環境はWindows2000、コンパイラは失念しました。
たしかGCCだったと思いますけど・・・。
0370デフォルトの名無しさん
2005/06/17(金) 23:38:030371デフォルトの名無しさん
2005/06/18(土) 00:31:36何をやっているかわかるかもしてない。
0372デフォルトの名無しさん
2005/06/18(土) 01:21:49それはファイルフォーマットの質問であって、
C/C++の質問じゃないだろう。
0373デフォルトの名無しさん
2005/06/18(土) 01:43:500374デフォルトの名無しさん
2005/06/18(土) 01:58:310375デフォルトの名無しさん
2005/06/18(土) 02:28:220376デフォルトの名無しさん
2005/06/18(土) 04:31:08ぐ ぐ れ (俺ならそうする)
"ID666" でぐぐって上から三つ目、
ttp://www.alpha-ii.com/snesmusic/tutorials/eid666.html
からリンクをたどって
ttp://www.alpha-ii.com/snesmusic/files/spc_file_format.txt
を見れば、曲のタイトルを256バイトまで拡張する方法が書いてある。
0377デフォルトの名無しさん
2005/06/18(土) 10:47:16ファイルサイズ分malloc()で確保したメモリに読み込みなんですが、
読み込み後4バイト単位で扱ったり1バイトで扱ったりします。
なので、読み込めればさえいいのですが。
size_t fread(void *バッファ , size_t サイズ , size_t カウント , FILE *ストリーム);
のsize_t サイズ , size_t カウント ,をどうすればいいのか決めあぐねています。
一応size_t サイズにファイルサイズを、size_t カウントを1としたものと、
size_t サイズを1に、size_t カウントをファイルサイズ分にしたものをビルドし実行
しましたところちゃんと読み込めているようなのですが、これでいいのでしょうか?
よろしくお願いします。
0378デフォルトの名無しさん
2005/06/18(土) 10:55:56基本的には戻り値に影響するだけなんで、適当に選べばいい。
あとは、パフォーマンスが違うかもしれない。(環境依存だろうけど)
0379デフォルトの名無しさん
2005/06/18(土) 10:59:300380& ◆po73KQOmZk
2005/06/18(土) 11:01:25#include <stdio.h>
struct info
{
char* name; /* 名前 */
int age; /* 年齢 */
char* sex; /* 性別 */
};
int main(void)
{
struct info data;
FILE *fp;
int i;
fp = fopen( "test.txt", "r" );
if( fp == NULL )
{
puts( "test.txtが開けません" );
return 1;
}
for(i=0; i<5 && !feof(fp); ++i) /* 5人分読み込む又はファイル末尾で終了 */
{
fscanf( fp, "%s %d %s", data.name, &data.age, data.sex );
printf( "%s %d %s\n", data.name, data.age, data.sex );
}
fclose( fp );
return 0;
}
こうすると強制終了されますが、なぜなの??文字列をポインタで扱うときのやり方に間違い
があるっぽいんだけど、どこを間違えてるのか教えてください
0381デフォルトの名無しさん
2005/06/18(土) 11:05:52>fscanf( fp, "%s %d %s", data.name, &data.age, data.sex );
ここで、data.nameとdata.sexは何も指していない。
fscanfに渡すポインタは有効なオブジェクトを指していないといけない。
0382質問です
2005/06/18(土) 11:22:33どこのサンプルを見ても文字列出力ばかりでわかりやすいサンプルが見つかりませんでした。
0383デフォルトの名無しさん
2005/06/18(土) 11:26:36戻り値については全く考慮していなかったので注意したいと思います。
ちょっと難しく考えすぎていたのでしょうか? 標準関数については警告
やエラーが出なければ良しとし進めたいと思います。
ありがとうございました。
0384デフォルトの名無しさん
2005/06/18(土) 11:26:540386質問です
2005/06/18(土) 11:27:55ありがとうございます(*´∀`)
0387デフォルトの名無しさん
2005/06/18(土) 11:28:04C/C++でその進め方は危ない。マニュアル(VCならMSDN)見て判断しろ。
0388デフォルトの名無しさん
2005/06/18(土) 11:47:48size_t foo = fread(buffer, 100, 10, fp);
すると100バイト読み込んでfooは1、
size_t foo = fread(buffer, 10, 100, fp);
すると190バイト読み込んでfooは19。
0389デフォルトの名無しさん
2005/06/18(土) 11:56:36{
short S;
long L = 0x10008000;
printf("S=L= %x\n", S = L);
}
このプログラムの動作はどういう風に説明すればいいいのでしょうか?
int counter = NULL;
char strings[MAX] = NULL;
memset(&structX, '\0', sizeof(structX));
char *cp = '\0';
このコードの間違いはどれなのかおしえてください。
0390デフォルトの名無しさん
2005/06/18(土) 12:05:40指定要素数分全部読み込めない場合のファイルポインタ移動量は
必ず要素サイズの倍数になる、って決まってるの?
0391デフォルトの名無しさん
2005/06/18(土) 12:07:33格上げ、符号拡張、NULL
0392デフォルトの名無しさん
2005/06/18(土) 14:23:08> char strings[MAX] = NULL;
死罪
0393デフォルトの名無しさん
2005/06/18(土) 14:29:27配列の初期定義にも使えない
&structX
ぬるぽ
0394デフォルトの名無しさん
2005/06/18(土) 14:40:580395デフォルトの名無しさん
2005/06/18(土) 15:01:52という意味のエラーを出し使い物にならないから苦肉の策として
0 を「ポインタがオブジェクトを参照していないことを示すポインタリテラル」にしたので
0396デフォルトの名無しさん
2005/06/18(土) 15:42:530397デフォルトの名無しさん
2005/06/18(土) 15:49:23そうとも限るんじゃないのか
定数0はあらゆるポインタに代入可能であってnull pointerと解釈されるが、
それ以外に、キャストせずにあらゆるポインタに代入可能なものが
C++では存在しないだろ
0398デフォルトの名無しさん
2005/06/18(土) 15:55:10保証されない。普通の実装では巻き戻ししないで終端まで行ったままの筈。
0399デフォルトの名無しさん
2005/06/18(土) 15:55:43NULLは意味論的にポインタなんだから、文法論でどうこう
いったってしかたないよ。'\0'もおなじ。
0400デフォルトの名無しさん
2005/06/18(土) 16:02:27ネタ昔読んだなあ
0401デフォルトの名無しさん
2005/06/18(土) 17:07:35こんなメンバを持つクラスにすればいい。
0402デフォルトの名無しさん
2005/06/18(土) 17:36:32無いですが、みなさん自作されてるんでしょうか??
0403デフォルトの名無しさん
2005/06/18(土) 17:42:24必要なら作る
0404デフォルトの名無しさん
2005/06/18(土) 17:45:40ないけどたいしたことはない。
sをchar配列やcharへのポインタだとするとLeftはs + nとするだけ、(書き換えされては困るならコピーを作ってから)
Rightもstrncpyでなんとかなる。組み合わせればMidもできる。
C++ならstd::basic_stringにいろいろとある。
0405デフォルトの名無しさん
2005/06/18(土) 17:48:31MFCのCStringにはそういうインタフェースがあるけどな
Cには文字列という型はないし
ポインタ操作や'\0'の挿入で代わりになるので
わざわざ関数作るまでもない、かな
0406デフォルトの名無しさん
2005/06/18(土) 18:13:02テキストを読んでいるとcurses.hとunistd.hをincludeする必要が出て来たのですが
BCCにはそのようなライブラリは無いのです
同じ書式で同じ効果を期待出来る様な、そんな都合の良いものは無いのでしょうか?
0407デフォルトの名無しさん
2005/06/18(土) 18:29:11double型の算術計算のオーバーフローを検出する方法ってあるでしょうか
例えば
double a = 1.79e307;
double b = 1.79e307;
double c = a + b;
これを実行するとcは0になります。例外とか出力されるとうれしいのですが・・・
コンパイラはC++Builder6です。
0408デフォルトの名無しさん
2005/06/18(土) 18:32:31cygwin+gcc入れろ
0409デフォルトの名無しさん
2005/06/18(土) 21:35:26x86例外
普通は無限大になると思うんだけどなぁ…
0410デフォルトの名無しさん
2005/06/18(土) 22:02:340411デフォルトの名無しさん
2005/06/18(土) 22:04:43マルチしますがスマソ。
マイコン組み込み系のソフト組んでて
こういう感じのテーブルジャンプのPGを組んだ。
void (*const rom_KansuuTable[10])(void) ={
test1,
test2,
test3,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
};
void (*test_pointer)(BYTE *);
0412デフォルトの名無しさん
2005/06/18(土) 22:05:00Loop1 = 0;
//関数アドレス読み出し
test_pointer = rom_KansuuTable[0];
//NULLがくるまで or 10個チェックするまで
while((test_pointer != NULL) && (Loop1 < 10)){
//関数実行
test_pointer(5);
//ループカウンタ更新
Loop1++;
//次の関数アドレス読み出し
test_pointer = rom_KansuuTable[Loop1];
}
特にコンパイルエラー/ワーニングがでるわけはないし,動作もちゃんとするんだけど
MISRAチェックをかけると
void (*test_pointer)(BYTE *);
^
--------------.c(---) ++ WARNING ++: <=4=(3672) constではない関数へのポインタを使用しています。Misra Rule 104
って怒られる。
ただ単純にtest_pointerを使わずにrom_KansuuTable[Loop1]を直接書きゃ解決なんだけど
ROM容量食うしね。
今は動作もちゃんとしてるんで,放置プレイしてるんだけど,なんか気持ち悪いので
解決方法があれば教えてください。
0413デフォルトの名無しさん
2005/06/18(土) 22:11:270414デフォルトの名無しさん
2005/06/18(土) 22:32:47でもMISRAチェックしなきゃ出荷審査通らないんだよ。
CMMもやってるから品質にはやかましくて。
とりあえず問題なしとして今までは通しておるが,できるなら消したいと思い
0415デフォルトの名無しさん
2005/06/18(土) 23:06:27関数の型が違くね?
0416411ではない
2005/06/18(土) 23:30:55void (*const test_pointer)(void);
ってこと?
しかし関数ポインタってよくわからんなぁ。
こっちの方が直感的でいいと思うが。
void test_pointer(void)* const;
0417デフォルトの名無しさん
2005/06/18(土) 23:42:44ジャンプテーブルの宣言では引数はvoidだと言ってて
test_pointerの宣言では引数はBYTE*だと言ってるじゃねーか
しかし
test_pointer(5);
という呼び出しを見ると、実はintだという落ちじゃねーだろうな
あと、Cでは面倒なら関数ポインタの仮引数リストを宣言しないという手もある
C++と互換性が無いコードになるしお勧めはできんがな
0418デフォルトの名無しさん
2005/06/18(土) 23:52:160419デフォルトの名無しさん
2005/06/18(土) 23:55:13rom_KansuuTable と test_pointer の型が違う。
関数ポインタが、まだ理解できないなら、
とりあえず、typedef して共通の型になるようにしとけ。
0420デフォルトの名無しさん
2005/06/19(日) 00:31:070421デフォルトの名無しさん
2005/06/19(日) 00:31:55C#でもDでも何でもどうぞ。補完しているかどうかは別にして。
0422デフォルトの名無しさん
2005/06/19(日) 00:53:45間違いなくC#
設計思想は素晴らしいがdirtyな文法も許容される
良い意味でC++らしさを残した言語です
0423デフォルトの名無しさん
2005/06/19(日) 01:13:06#include <stdlib.h>
int main(void)
{
char a;
do {
printf("何か入力して下さい\n");
scanf("%d", &a);
printf("a = %d\n\n", a);
if(a == -40)
exit(-1);
} while(a != '67');
return 0;
}
最近C言語を始めたのですが、どうもわからないことがあります。
このプログラムなんですが、aに文字を入れると値が-40になります。
AだろうがQだろうがUだろうが-40になってしまいます。
それだけならいいのですが、aに-40が入ったらループを抜けるようにしないと
scanfを無視してループしてしまいます。
これはなんなのでしょうか…。
0424423
2005/06/19(日) 01:13:55コンパイラはVC6++についてきたものです。
0425デフォルトの名無しさん
2005/06/19(日) 01:14:490426デフォルトの名無しさん
2005/06/19(日) 01:16:110427デフォルトの名無しさん
2005/06/19(日) 01:16:31printf("a = %c\n\n", a)
0428デフォルトの名無しさん
2005/06/19(日) 01:20:370429デフォルトの名無しさん
2005/06/19(日) 01:22:030430デフォルトの名無しさん
2005/06/19(日) 01:27:20scanf("%d", &a);
の前にも
printf("a = %d\n", a);
を入れてみるといいよ。
あと、scanfは(printfもだけど)int型の関数だから
なにか値を返すらしいよ。
0431デフォルトの名無しさん
2005/06/19(日) 01:46:24printf("%d\n",67);
printf("%c:",'67');
printf("%c\n",67);
困ったときはdebug write
0432423
2005/06/19(日) 02:06:04#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char a, b;
do {
printf("a = %d, b = %d\n", a, b);
printf("何か入力して下さい\n");
printf("scanfの戻り値 %d\n", scanf("%c %c", &a, &b));
printf("a = %d, b = %d\n\n", a, b);
} while(a != 69);
return 0;
}
実際にprintfを入れて試してみたらよくわかりました。
代入されなかったら0が返るんですね。
ヘルプを見てみると、戻り値の数だけ引数が増えるというのでやってみました。
aとbに両方正しい値が入ると引数が2になります。
恐らくscanfに値が入らないとラインバッファに値が残っているため
その値をを入れようとしても入らないためにまた残るので
永久ループになっていたのだと思います。
>>431
その67というのは69を入れようとして間違ったんですよ。
最初は'E'で比較していたのですが、Eのアスキーコードをいれてやれば
代用できるんじゃないかなと試してみました。
そのときにシングルクォーテーションをとり忘れてるんです。
0433デフォルトの名無しさん
2005/06/19(日) 02:08:360434423
2005/06/19(日) 02:17:36やっぱりそうですか。
でも、書き方はいろいろ覚えておいたほうが損は無いかなと思ったんです。
0435デフォルトの名無しさん
2005/06/19(日) 02:28:23コンパイル後には同じになるんだから、
人間が見て見やすい方にしろ。
0436423
2005/06/19(日) 02:33:44よく考えたら誰が見てもわかりやすいものが一番いいですね…。
そうすることにします
0437デフォルトの名無しさん
2005/06/19(日) 02:52:54class CA {
char hoge[val];
};
こうした場合、::val にしろと言われたのですが、これは
信じていいのですか?
この x 。 ::x にしろと、いつか言われたのですが、
これは洒落でしょうか?
0438デフォルトの名無しさん
2005/06/19(日) 02:53:430439デフォルトの名無しさん
2005/06/19(日) 02:54:02だが、断る!
0440デフォルトの名無しさん
2005/06/19(日) 03:01:58「::」が何を意味するのか考えれば自明だろ?
漏れはWin32API呼ぶときとかは必ず付けてるけどな
0441デフォルトの名無しさん
2005/06/19(日) 03:09:14ここにいる人に聞くと、なんか説得力あるんだよな・・・
>>440
ありがとうございました。付けた方が良さそうですね。
0442デフォルトの名無しさん
2005/06/19(日) 03:13:29ネームスペースでググレ
0443デフォルトの名無しさん
2005/06/19(日) 03:40:01激しく勘違いしてる余寒
0444デフォルトの名無しさん
2005/06/19(日) 03:53:31おーいー
>「::」が何を意味するのか
を激しく勘違いしとるぞ
答えだけ言うと、例題を見る限りはいらない
ていうかグローバルネームスペースに
valなんて汎用的な名前を漏らすなよ
class CA { static const int MAX_VAL = 5; (ry とかにしとけ
0445デフォルトの名無しさん
2005/06/19(日) 04:07:08洒落じゃ無くてお洒落なのです。
0446411
2005/06/19(日) 11:21:35>>416
>>417
>>419
すまん。例としてその場で書いたので間違いがあったようです。
なので
void (*test_pointer)(BYTE *); はvoid (*test_pointer)(unsigned char *);
void (*const rom_KansuuTable[10])(void) をvoid (*const rom_KansuuTable[10])(unsigned char)
test_pointer(5);をtest_pointer((unsigned char)5);
と読み替えてください。
というわけでどうすべきか皆さんの意見聞かせてください。
0447デフォルトの名無しさん
2005/06/19(日) 11:30:28それはさておき、こうしたらだめ?
for (Loop1 = 0; (test_pointer != NULL) && (Loop1 < 10); Loop1++) {
void (*const test_pointer)(BYTE *) = rom_KansuuTable[Loop1];
test_pointer(5);
}
0448デフォルトの名無しさん
2005/06/19(日) 12:03:55> void (*test_pointer)(unsigned char *);
> void (*const rom_KansuuTable[10])(unsigned char)
どっちにしろ型が違う。
型が違うという事は、
環境によってはサイズが変わるから、必ず同じ型に汁。
0449447
2005/06/19(日) 12:07:58> unsigned char *へのポインタ
○| ̄|_
0450デフォルトの名無しさん
2005/06/19(日) 12:10:40の例で、test_pointerを使う必要性が感じられない。
って言うか、警告すら出ないのが不思議なくらいだ。
for( i=0; i<sizeof(rom_KansuuTable)/sizeof(*rom_KansuuTable) && rom_KansuuTable[i]; i++ )
{
/* 関数テーブル呼び出し */
rom_KansuuTable[i]( 5 );
}
で、いいんジャマイカ。
0451デフォルトの名無しさん
2005/06/19(日) 12:24:42test_pointer の代入前に比較しちゃアカン。
0452Hoge1、Hoge2は適当に補間してくれ
2005/06/19(日) 12:29:17やりたい事は、こんな感じか?
#include <stdio.h>
/* 関数ポインタ型定義 */
typedef void (*FunctionPtr)( int hoge );
/* 関数プロトタイプ */
void Hoge1( int hoge );
void Hoge2( int hoge );
/* 関数テーブル定義 */
const FunctionPtr FncTable[] =
{
Hoge1 /* 関数 1 */
,Hoge2 /* 関数 2 */
,NULL /* ストッパー */
};
/* main() */
int main( void )
{
int i;
for( i=0; FncTable[i]; i++ ) /* ストッパーが来るまでループ */
{
/* 関数テーブルから呼び出し */
(FncTable[i])( i );
}
return 0;
}
0453おしえて
2005/06/19(日) 13:24:46たまにcppでかかれてて分割ファイルになってたりするのがありますよね。
あれはVC++ではどうやってコンパイルしたらいいのですか。
プロジェクトファイルとかワークスペースみたいなものがついてなくて、
どれからコンパイルすればいいのかわからないし。どうやってリンクしたら
いいのかも実はわかりません。
makefileがついてたのでbccでやってみたんですがエラーになります。
たぶんbcc用のじゃなくてgccとかのmakefileのようです。
どうすればいいの??
0454デフォルトの名無しさん
2005/06/19(日) 13:28:460455デフォルトの名無しさん
2005/06/19(日) 13:34:10VCならとりあえず新しいプロジェクトを作り、
プロジェクトのフォルダの中に元と同名のcppファイルやh/hppファイルなどを作り、
それぞれ元のファイルから内容をコピーするってのはどうだ?
0456デフォルトの名無しさん
2005/06/19(日) 13:39:04そんな無駄な努力せんでも既存ファイルをプロジェクトに追加するのは可能だが。
まぁ、単純にコンパイルすればいいだけなら*.c/*.cppファイルだけ全部プロジェクトにつっこんでビルドすれば大体いける
0457デフォルトの名無しさん
2005/06/19(日) 14:02:04main{
char *filename = "example.txt";
printf("%d\n",remove(filename));
printf("%d\n",rename("change.txt",filename));
}
と入力すると、その出力が両方とも-1(remove,renameともに失敗)となります。
なにか原因として考えられることはあるでしょうか?
0458457
2005/06/19(日) 14:05:39×カレントディレクトリにexample.txt,change_txt
○カレントディレクトリにexample,txt,change.txt
0459デフォルトの名無しさん
2005/06/19(日) 14:05:520460デフォルトの名無しさん
2005/06/19(日) 14:15:110461& ◆hJb7GWrzxo
2005/06/19(日) 14:29:39たとえばこのソースコードをコンパイルするときにはどうすればいいんですか。
DOS窓でmakeとかやってもうまくできないんだけど・・・
やりかたがチガウ??
0462デフォルトの名無しさん
2005/06/19(日) 14:42:16「うまくできない」じゃわからん。エラーメッセージかなんか貼れよ。
0463デフォルトの名無しさん
2005/06/19(日) 14:56:140464457
2005/06/19(日) 14:57:11なるほど、perrorという関数でエラーの種類がわかるのですね。
そこで使ってみたところ、「Permission denined」というエラーが出ました。
英語を調べてみたところ「許可が否定された」ということらしいのですが原因がわかりません。
一応カレントディレクトリのファイルを調べてみたところ、
読み取り専用の項目にチェックはついていませんでした。
0465デフォルトの名無しさん
2005/06/19(日) 14:59:48カレントディレクトリのWritePermissionを調べよ。
あー、WinNT系か。それなら「読取専用」だけでなく「セキュリティ」タブも調べよ。
0466おしえて
2005/06/19(日) 15:10:48CFLAGS = -DWIN32
LIBS = -lglut32 -lglu32 -lopengl32 -lm
SRC = main.o diff.o meshdraw.o gl_screenshot.o
a.exe: $(SRC)
g++ -o $@ $(SRC) $(CFLAGS) $(LIBS)
.cpp.o:
g++ -c $<
こういうmakefileがはいってるんだけど、コレってDOS窓でmakeできないよね??
つーかmake a.exeって実行方法が間違いじゃねーよね??
0467デフォルトの名無しさん
2005/06/19(日) 15:12:46なんでできないと思ったの?エラーが出るならエラーメッセージ貼れよ。
0468& ◆hJb7GWrzxo
2005/06/19(日) 15:14:100469デフォルトの名無しさん
2005/06/19(日) 15:16:19そのmakefileなら、普通はmakeに引き数は要らない。
0470デフォルトの名無しさん
2005/06/19(日) 15:16:58アホかい。cygwinでもインストールしてcygwin上でmakeせい。
#gccにチェックを入れるのを忘れずに。
0471デフォルトの名無しさん
2005/06/19(日) 15:17:22だったら g++ が無いのが原因。
DOS窓のせいでも make のせいでもない。
実行方法は間違いじゃない。
0472デフォルトの名無しさん
2005/06/19(日) 15:20:41#if 0
#endif
0473デフォルトの名無しさん
2005/06/19(日) 15:23:13「この間はコンパイルしない」
コメントアウトの強力版としてよく使われる。
0474デフォルトの名無しさん
2005/06/19(日) 15:26:06あーそうなんですか、即レスありがとうございます
レスで気になったので再度すみませんが質問を…
コメントアウトで十分な気がするんですが、どんな時に使うのでしょう?
0475デフォルトの名無しさん
2005/06/19(日) 15:30:33利点としては
・#if 1 にすればすぐに復活可能
・ネストできる
0476おしえて
2005/06/19(日) 15:31:22それって無理なんすか
0477デフォルトの名無しさん
2005/06/19(日) 15:33:21お〜分かりました
ありがとうございましたー
0478デフォルトの名無しさん
2005/06/19(日) 15:34:11有理
0479デフォルトの名無しさん
2005/06/19(日) 15:35:43学習能力無いのか?
なんで無理だと思ったの?エラーが出るならエラーメッセージ貼れよ。
0480デフォルトの名無しさん
2005/06/19(日) 15:37:09/*
/* */
*/
これだと2行目でコメント終わり。3行目でエラー。気をつけろ。
0481デフォルトの名無しさん
2005/06/19(日) 15:59:23抽出するコマンドラインツールはないでしょうか。
% listfunc "void *(int,int)" sample.c
void func1(int a, int b)
void func2(int a, int b)
といったイメージです。
0482デフォルトの名無しさん
2005/06/19(日) 16:03:130483481
2005/06/19(日) 16:23:34grep+sedでがんばってみたのですが
改行があったり#ifdefがあったり、なかなかやっかいなので
既存のツールがあればと思って質問させてもらいました。
0484デフォルトの名無しさん
2005/06/19(日) 16:25:12タグファイルって(略
0485デフォルトの名無しさん
2005/06/19(日) 16:27:01受信したデータbufferをパラメータとそれ以外のデータに分けたいんですが
パラメータ以外の項目数やデータ型や長さなどが明確でないので
sscanfが使えないんですが どうすればあっさりできるでしょうか?
buffer・・・12345 hoge 123 aaa...
パラメータ・・・12345 それ以外のデータ hoge 123 aaa...
0486481
2005/06/19(日) 16:31:28ctagsコマンドの出力のtagsファイルをgrepなどすれば望みがかないそうです。
ありがとうございました
0487デフォルトの名無しさん
2005/06/19(日) 16:36:19スペース区切りならスペースまで読み出せばいいんじゃないの?
0488デフォルトの名無しさん
2005/06/19(日) 16:36:39む、分かってるじゃないかい。
0489デフォルトの名無しさん
2005/06/19(日) 17:03:42警告: `関数' は前方で暗黙的に `int' を返すと宣言されました
という警告がでました。
この関数はdouble型を返すように宣言しています。
勝手にintで返すためプログラムがうまく動作しません
警告はなぜ発生するのですか?
0490デフォルトの名無しさん
2005/06/19(日) 17:04:430491485
2005/06/19(日) 17:27:04sscanf(buffer,"%d %s",param,soreigai);ってするとsoreigaiにはhogeしかはいらないんですが
0492デフォルトの名無しさん
2005/06/19(日) 17:30:41%[]
0493489
2005/06/19(日) 17:32:00conflicting types for `関数'
previous declaration of `関数'
というエラーがでてコンパイルできませんでした。
(たぶん宣言の仕方は間違ってないと思うけど・・・)
というよりプロトタイプ宣言しなくても関数は使えますよね?
0494デフォルトの名無しさん
2005/06/19(日) 17:32:48手前に同じ名前の関数が宣言されていて、その内容と食い違っている。
0495489
2005/06/19(日) 17:42:56#include<math.h>
#define Th 30.0
int check[1000][1000];
char *sep(char,int,int,int,int,int,int,int);
main()
{
}
unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY,
int k,int nx,int ny)
{
}
こんな感じですけど間違いはありますか?
この他にもう1つ関数がありますが同様に宣言しており
同じ名前の関数は宣言されてません。
0496485
2005/06/19(日) 17:44:13sscanf(buffer,"%d %[]",param,soreigai);ってすると実行エラーになるんですが
0497デフォルトの名無しさん
2005/06/19(日) 17:45:16> unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY, int k,int nx,int ny)
宣言と定義でちがっとる。
0498デフォルトの名無しさん
2005/06/19(日) 17:53:37簡潔に書くとこんな感じ。
template <typename _T, int _X>
class Test {
public:
Test( _T hoge ) : len(_X) {};
protected:
const int len;
};
main()
{ Test<int, 2>;}
Test( _T hoge ) の : 以降の部分が何を意味するのかわかりません。
const int のキャストと同じ意味でしょうか?
0499489
2005/06/19(日) 17:55:27unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY,int k,int nx,int ny)
ということでしょうか?
他にも考えられる宣言をしているのですがエラーがでます。
下の行が実際の関数なのでそれに合う正しいプロトタイプ宣言
はどうなるのでしょう?
0500デフォルトの名無しさん
2005/06/19(日) 17:57:530501489
2005/06/19(日) 18:06:20依然と実行結果は変わらず、原因は他にあるのだとわかりました。
勉強になりました。ありがとうございました。
0502デフォルトの名無しさん
2005/06/19(日) 18:09:34メンバ変数lenを_Xで初期化している。
0503デフォルトの名無しさん
2005/06/19(日) 18:12:42ありがとうございます
0504デフォルトの名無しさん
2005/06/19(日) 18:13:28unsigned char *sep(unsigned char *input,int bX,int eX,int bY,int eY,int k,int nx,int ny);
0505デフォルトの名無しさん
2005/06/19(日) 18:35:30質問とは関係ないが、アンスコ始まりの名前使うな。
0506デフォルトの名無しさん
2005/06/19(日) 18:38:34その受信データに改行コードがないことが判っているなら、
%[^\n]
#つーか、少しは検索してみろよ。
0507485
2005/06/19(日) 19:22:21指定した文字数目から末尾まで取ってくるっていう関数がほしかったのです
ありがとうございます 何とかなりました
0508& ◆QWv3R1XL8M
2005/06/19(日) 19:27:20エラー E2303 meshdraw.h 17: 型名が必要
エラー E2139 meshdraw.h 17: 宣言に ; がない
エラー E2303 meshdraw.h 18: 型名が必要
エラー E2238 meshdraw.h 18: 'MaterialStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 17: 一つ前の 'MaterialStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 18: 宣言に ; がない
エラー E2303 meshdraw.h 19: 型名が必要
エラー E2238 meshdraw.h 19: 'MaterialStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 18: 一つ前の 'MaterialStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 19: 宣言に ; がない
エラー E2303 meshdraw.h 20: 型名が必要
エラー E2238 meshdraw.h 20: 'MaterialStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 19: 一つ前の 'MaterialStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 20: 宣言に ; がない
エラー E2303 meshdraw.h 23: 型名が必要
エラー E2139 meshdraw.h 23: 宣言に ; がない
エラー E2303 meshdraw.h 24: 型名が必要
エラー E2238 meshdraw.h 24: 'LightStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 23: 一つ前の 'LightStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 24: 宣言に ; がない
エラー E2303 meshdraw.h 25: 型名が必要
エラー E2238 meshdraw.h 25: 'LightStruct::GLfloat' の宣言が複数見つかった
エラー E2344 meshdraw.h 24: 一つ前の 'LightStruct::GLfloat' の定義位置
エラー E2139 meshdraw.h 25: 宣言に ; がない
エラー E2228 meshdraw.h 25: エラーあるいは警告が多すぎる
*** 26 errors in Compile ***
** error 1 ** deleting main.o
>>479
g++をbcc32に書き換えてもこんなエラーがでるので無理なんかなとおもったんですが。
0509デフォルトの名無しさん
2005/06/19(日) 19:35:33sをchar配列やcharへのポインタとしたらs + nでn番目の文字数目からの文字列を表せる。それをstrcpyでもすればいい。
0510デフォルトの名無しさん
2005/06/19(日) 19:42:55学習能力無いのか?
'GL/glut.h' をインクルードできないのが問題だろ。
bcc32 のせいでもDOS窓のせいでもない。
0511508
2005/06/19(日) 20:06:05bcc32用にglutをセットアップしてmakeしてみた。
するとこんなエラーがひとつ出た。
エラー E2337 c:\Borland\Bcc55\include\stdlib.h 584: オーバーロード関数群の中の 1 つだけしか "C" にできない
どういう意味だよオイ。
検索しても出ねえ。
0512デフォルトの名無しさん
2005/06/19(日) 20:20:00は?日本語は苦手ですか?
0513デフォルトの名無しさん
2005/06/19(日) 20:21:51extern "C" として宣言される関数は、関数名だけで一意に判別できないといけないので、
引数の型によるオーバーロードができない。
stdlib.h の 584行目で宣言されてる関数と
同じ名前の関数が無いか調べてみるといい。
0514デフォルトの名無しさん
2005/06/19(日) 20:23:38いや、これはエラーメッセージを手がかりにするのは厳しいだろう。
せめて extern "C" と書いてあればなんとかなるだろうが。
0515デフォルトの名無しさん
2005/06/19(日) 20:26:02そうですか。人によるのかなぁ。
0516デフォルトの名無しさん
2005/06/19(日) 20:30:32日常茶飯だからな
0517デフォルトの名無しさん
2005/06/19(日) 20:32:550518デフォルトの名無しさん
2005/06/19(日) 20:34:07それともチラシの裏なのか?
0519508
2005/06/19(日) 20:43:07学習能力がないので知りませんでした。
つーかstdlib.hの584行目は
using std::exit;
だったんですが、これが一体どうだっていうんですか?おしえてください
0520デフォルトの名無しさん
2005/06/19(日) 20:44:44他にグローバルでexit()っていう関数がない?
0521デフォルトの名無しさん
2005/06/19(日) 20:47:360522508
2005/06/19(日) 20:50:410523デフォルトの名無しさん
2005/06/19(日) 20:54:01ttp://www.google.co.jp/search?q=glut+exit+extern+%22C%22
0524デフォルトの名無しさん
2005/06/19(日) 20:54:19ゴクヒで
ヘッダなんざただのテキストファイルなんだから、viでチョイチョイだろ
ゴクヒで
0525デフォルトの名無しさん
2005/06/19(日) 20:57:08藻前はコンパイルしたいのかしたくないのかどっちなんだ?
0526デフォルトの名無しさん
2005/06/19(日) 20:58:53そうだよな。そのまま何度もコンパイルしてたほうがいいよなw
0527デフォルトの名無しさん
2005/06/19(日) 21:09:00たとえばa,dという文字ならa<dっていう感じにしたいんですが。
0528デフォルトの名無しさん
2005/06/19(日) 21:10:45asciiならそのまま'a' < 'd'で。
0529508
2005/06/19(日) 21:17:05エラー E2451 c:\Borland\Bcc55\include\GL/glut.h 503: 未定義のシンボル exit(関数 __stdcall glutCreateWindow_ATEXIT_HACK(const char *) )
エラー E2451 c:\Borland\Bcc55\include\GL/glut.h 549: 未定義のシンボル exit(関数 __stdcall glutCreateMenu_ATEXIT_HACK(void (*)(int)) )
コメント化したexitが未定義のシンボルになってエラーでます。
上の三行もコメント化してみたんですが、すると
エラー E2268 meshdraw.cpp 41: 未定義の関数 'glutInit_ATEXIT_HACK' を呼び出した(関数 MeshDraw::init(int,char * *,Solver *) )
エラー E2268 meshdraw.cpp 45: 未定義の関数 'glutCreateWindow_ATEXIT_HACK' を呼び出した(関数 MeshDraw::init(int,char * *,Solver *) )
こうなりました。
やっぱglut.hのexit使ってるみたいなんだけど・・・これって解決困難?
0530デフォルトの名無しさん
2005/06/19(日) 21:22:39んじゃ、glut.hでinclude <stdlib.h>とか。
0531デフォルトの名無しさん
2005/06/19(日) 21:24:19exit の宣言が要るんなら、削除じゃなくて #include <stdlib.h> に置き換えればいいんじゃね?
0532508
2005/06/19(日) 21:28:490533デフォルトの名無しさん
2005/06/19(日) 21:30:400534デフォルトの名無しさん
2005/06/19(日) 21:33:48>glut.h の 146 行目「extern _CRTIMP void __cdecl exit(int);」をコメントアウト ( 頭に // をつける ) 。
> 使うときは、glut.h より前に stdlib.h か windows.h を include します
0535デフォルトの名無しさん
2005/06/19(日) 21:37:55ちょっとしたネットワークプログラムを作っています。
SIGCHLDをキャッチしてその中からログファイルへの書き出し
をしているのですが、localtimeを呼び出しているところで
ブロックしてしまいます。
デバッグのためにElectricFenceをリンクしているのですが
それを外せばブロックしません。
解決方法などはあるのでしょうか?
または何かおかしいことをやっているのでしょうか?
なお、VineLinux3.1 FTP版
gcc-3.3.2-0vl8
kernel-2.4.31
ElectricFence-2.2.2-11vl2
です。
VineLinuxの公式kernelの、kernel-2.4.27-0vl7.3でも同じ問題が発生しました。
なお、同じ問題が再現するソースを次に示します。
0536535
2005/06/19(日) 21:39:09#include <stdio.h>
#include <signal.h>
#include <time.h>
void handler(int signo)
{
time_t t = time(NULL);
struct tm *tt = localtime(&t);
}
void setup_signal()
{
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_NOCLDSTOP | SA_RESTART;
sigaction(SIGCHLD, &act, NULL);
}
int main()
{
setup_signal();
if(fork() == 0) exit(0);
sleep(1);
return 0;
}
# gcc a.c -lefence
0537508
2005/06/19(日) 21:45:00で、その類のエラーは消えたんですがa.exeが見つからないというエラーがでるようになりました。
makefileはこう書き換えてあるんですが
CFLAGS = -DWIN32
LIBS = -lglut32 -lglu32 -lopengl32 -lm
SRC = main.obj diff.obj meshdraw.obj gl_screenshot.obj
a.exe: $(SRC)
bcc32 -o $@ $(SRC) $(CFLAGS) $(LIBS)
.cpp.o:
bcc32 -c $<
ところで、a.exeってなんすか。
a.outみたいなもんすか。
もしかしてcygwin用ですか。
DOS窓でbccでやるときにはa.exeは何か別の名前にすべきなんですか
0538デフォルトの名無しさん
2005/06/19(日) 21:45:35ぁるんですけど、そーゆーのって
ここで聞いてもぃぃnですか??すぃませnooo
0539デフォルトの名無しさん
2005/06/19(日) 21:46:53C/C++の宿題を片付けます 45代目
http://pc8.2ch.net/test/read.cgi/tech/1118165596/l50
0540デフォルトの名無しさん
2005/06/19(日) 21:47:040541デフォルトの名無しさん
2005/06/19(日) 22:01:38――――――――――――――――――――――――
| KURASU-TAB |
――――――――――――――――――――――――
|SEITO(1)|SEITO(2)|SEITO(3)|〜〜|SEITO(40)|
――――――――――――――――――――――――
テーブルKURASU-TABのSEITO(1)に1を、(2)に2を・・・
SEITO(40)に40を初期値として空欄をうめなさぃ。
MOVE (ア)
PERFORM UNTIL (イ)
COMPUTE SOE = SOE + 1
MOVE (ウ) TO SEITO(SOE)
END-PERFORM
0542デフォルトの名無しさん
2005/06/19(日) 22:03:450543デフォルトの名無しさん
2005/06/19(日) 22:07:25ElectricFenceとやらを知らないので、外してるかもだけど、
localtime の代わりに localtime_rを使ってもだめ?
0544デフォルトの名無しさん
2005/06/19(日) 22:10:56おまいには学習能力がない。ひょっとしたら人並みの思考能力もないかもしれない。
このままプログラミングをやってもおまいも含めて周りの人間を不幸にしかしないと思われる。
よって、プログラミングをやめるか、さもなくば首吊って氏ね。
冥土の土産に答えとくと
bcc32 -o $@ $(SRC) $(CFLAGS) $(LIBS)
を
bcc32 -o$@ $(SRC) $(CFLAGS) $(LIBS)
に書き換えて make しろ。
0545デフォルトの名無しさん
2005/06/19(日) 22:11:32というか、localtimeは「安全な関数」ではないみたいだけど。
0546535
2005/06/19(日) 22:48:06うーむ、localtime_rも「安全な関数」ではないですが
これが原因なんでしょうかね。
しかしどちらにしろ推奨されていない実装はよした方がいいですね。
別の方法も考えて見ます。
0547デフォルトの名無しさん
2005/06/19(日) 23:11:03最低限、以下の事に答えて頂けると、答える側としては助かります。
よろしくお願いします m(__)m
1. その「駄目」というのは、546と同じ症状、つまり「localtime_rでブロックして
しまう」という解釈でいいですか?
2. 「ブロックしてしまう」というのは関数が呼ばれたまま返ってこないという
解釈でいいですか?
3. 「ブロックしてしまう」というのは具体的にはどうやって確かめましたか?
4. ネットワークプログラムを作っているそうですが、そういう余計なものを
一旦取っぱらって、単にforkしてlocaltimeを呼ぶだけという短いプログラムでも
同じ状況が再現されますか?
5. timeの結果は正しいと確認できてますか? (どのように確認しましたか?)
0548508
2005/06/19(日) 23:25:53書き換えてmakeした結果↓
Fatal: ファイル A.EXE が開けません
・・・駄目じゃん。思考力がないのはその通りなのでもっとヒントをくれよ
0549デフォルトの名無しさん
2005/06/19(日) 23:27:28はぁ?自分で実行したプログラムくらい管理せい!
0550デフォルトの名無しさん
2005/06/19(日) 23:29:40たぶn別のリンカエラーがまたでてくる木がするけど
0551デフォルトの名無しさん
2005/06/19(日) 23:31:020552デフォルトの名無しさん
2005/06/19(日) 23:34:52独り言はチラシの裏にかけよ、なっ!
0553デフォルトの名無しさん
2005/06/19(日) 23:36:53{
public:
void showX();
private:
A* x;
int v;
};
void A::showX()
{
std::cout << x->v << std::endl;
}
というコードをうっかり書いたらコンパイラ通っちゃったんですが
x->vでアクセス違反にならないんでしょうか?気になって夜も眠れません。
0554デフォルトの名無しさん
2005/06/19(日) 23:38:24それは回答者へのダメだしか?
0555デフォルトの名無しさん
2005/06/19(日) 23:40:52アクセス制御はインスタンス単位ではなくクラス単位に働くのですよ
0556デフォルトの名無しさん
2005/06/19(日) 23:41:21文法的に間違ってないし。
でもとりあえず解決してから寝たほうがいい。
0557デフォルトの名無しさん
2005/06/19(日) 23:41:24それは正常な動作。
showX が実行されるときに、xがちゃんと初期化されていれば
アクセス違反にはならない。
0558デフォルトの名無しさん
2005/06/19(日) 23:41:58未初期化のポインタを使ってるから未定義動作だろ。
0559デフォルトの名無しさん
2005/06/19(日) 23:44:39通らない理由がないからコンパイルは通るね。
例えばコンストラクタで適切に値をセットするならアクセス違反にもならないし。
そんなことで眠れなくなるくらいならプログラミングをやめた方がいいよ。
#寧ろデスマ要員として就職できたりしてw
0560デフォルトの名無しさん
2005/06/19(日) 23:45:46つーか、>558は預言者かい。
0561535
2005/06/19(日) 23:47:591,2 はい、その通りです。
3 前後にprintfを挟んで確認しました。
また、プログラムが永久にハングします。
4.単にforkしてlocaltimeを呼ぶだけでは発生しません。
5. printf("%d\n", t); として確認しました。
0563デフォルトの名無しさん
2005/06/19(日) 23:55:13>省略してますが初期化はしてます。
w
アクセス制御とメモリの保護を一緒にしないでね。
0564デフォルトの名無しさん
2005/06/19(日) 23:58:14>>547ではないけどさ
1と4の答えのつじつまが合ってないように見えるんだが、気のせい?
0565デフォルトの名無しさん
2005/06/19(日) 23:59:43なんでしたいのか良くわからんけど
コンパイル時にアクセス制御したいなら無理かも
実行時ならthis と xを比較すればいいんじゃね?
0566デフォルトの名無しさん
2005/06/20(月) 00:05:29ありがとうございました。
0567535
2005/06/20(月) 00:08:16詳しい説明をお願いします。
0568デフォルトの名無しさん
2005/06/20(月) 00:22:59誤読ならすまんが
1ではlocaltime とか localtime_r でブロックしてしまう、と言っているように見える。
4ではlocaltimeだけなら大丈夫だった、と言っているように見える。
(聞きたいのは localtime (localtime_r) 自体でブロックしているのかいないのか)
とにかくブロックしてないコードにちょっとずつコードを追加していってみては?
0569デフォルトの名無しさん
2005/06/20(月) 00:40:46time()の結果をパイプに書いておしまいにするみたいにしたら。
パイプは、selectとかで待つとして。
0570デフォルトの名無しさん
2005/06/20(月) 00:46:12その、"あんまり"を説明してください
0571535
2005/06/20(月) 00:53:37あ、なるほど、そういうことでしたか。
私はforkだけで、signalを使わないプログラムでは発生しない
というつもりで書いてました。紛らわしい書き方をしてすみません。
0572535
2005/06/20(月) 01:05:54やはりそういう方法を取ろうと思います。
0573デフォルトの名無しさん
2005/06/20(月) 02:30:08MOV EBP,ESP
SUB ESP,0C
MOV EAX,[ARG.1] ;buffer adrress
MOV [LOCAL.1],EAX
MOV EAX,[ARG.2] ;buffer size
CDQ
AND EDX,3
ADD EAX,EDX
SAR EAX,2
MOV [LOCAL.3],EAX
MOV [LOCAL.2],0
JMP SHORT b:
a: MOV ECX,[LOCAL.2]
ADD ECX,1
b: MOV [LOCAL.2],ECX
MOV EDX,[LOCAL.2]
CMP EDX,[LOCAL.3]
JGE SHORT z:
MOV EAX,[LOCAL.2]
MOV ECX,[LOCAL.1]
MOV EDX,DS:[ECX+EAX*4]
XOR EDX,12345678
MOV EAX,[LOCAL.2]
MOV ECX,[LOCAL.1]
MOV DS:[ECX+EAX*4],EDX
JMP SHORT a:
z: MOV ESP,EBP
POP EBP
RETN
このように成る様Cで書いてるんですが上手くかけません。
0574537
2005/06/20(月) 02:33:11int a = buffer;
int b = bufsize/4;
int i;
for (i=0;i < b;i++){
a = (a + (4 * i) ^DATXOR);
}
return 0;
}
これだとダメなわけですが、既にあるbefferを配列として扱えるのでしょうか?
0575574
2005/06/20(月) 02:34:050576デフォルトの名無しさん
2005/06/20(月) 03:10:520577デフォルトの名無しさん
2005/06/20(月) 03:39:38でもダメでした。
>>574ので XOR EDX,12345678 までは同じコードになるのですが、
以降違ってしまいます。 配列にしようとしたところ、4行目辺りから
違うものになってしまい、配列は関係ないようです。
a+i = (a + (4 * i) ^DATXOR); こんな感じのが許されるなら同じに
なりそうなのですが。
0578デフォルトの名無しさん
2005/06/20(月) 03:50:000579デフォルトの名無しさん
2005/06/20(月) 04:02:34でも、付け加えるのか、置き換えるのか、解りません。
最初の定義だとしてチャレンジ中です。
0580579
2005/06/20(月) 04:19:37なりましたが、まだダメでした。
申し遅れましたが最近Cの勉強を始め、WisdomSoftのC言語入門、48.バイナリデータ
まで、解ったつもりの初心者でした。
0581580
2005/06/20(月) 05:27:26int *a = buffer;
int i;
int b = bufsize/4;
for (i=0;i < b;i++) a[i] = a[i]^ DATXOR;
}
以上の様にしましたところ、同じになりました。
>>578さん、ありがとうございました。<(_ _)>
0582デフォルトの名無しさん
2005/06/20(月) 12:34:54わかりません。
だれか教えてください。
よろしくお願いします。
0583デフォルトの名無しさん
2005/06/20(月) 13:08:30.netスレ池
0584デフォルトの名無しさん
2005/06/20(月) 13:10:510585デフォルトの名無しさん
2005/06/20(月) 13:22:000586デフォルトの名無しさん
2005/06/20(月) 14:18:54#include <stdio.h>
#define MAX( a, b ) ( a < b ? b : a)
#define MIN( a, b ) ( a > b ? b : a)
/* 足の少ない方の動物の頭数を返す ( -1 == ERROR )*/
int get_head1(int feet1, int feet2, int all_head, int all_feet)
{
if(feet1 < 1 || feet2 < 1) return -1;
if( MIN(feet1, feet2) * all_head > all_feet ) return -1;
if( MAX(feet1, feet2) * all_head < all_feet ) return -1;
return ( all_feet - all_head * MIN(feet1, feet2) ) / MAX(feet1, feet2);
}
/* 脚の多い方の動物の頭数を返す (-1 == ERROR )*/
int get_head2(int feet1, int feet2, int all_head, int all_feet)
{
int ans = get_head1(feet1, feet2, all_head, all_feet);
if( ans != -1 ) ans = all_head - ans;
return ans;
}
int main()
{
int kame_feet = 4;
int turu_feet = 2;
int all_head = 10;
int all_feet = 30;
printf("turu = %d\n", get_head1(kame_feet, turu_feet, all_head, all_feet));
printf("kame = %d\n", get_head2(kame_feet, turu_feet, all_head, all_feet));
return 0;
}
0587デフォルトの名無しさん
2005/06/20(月) 14:22:50char str2[20] = "bbbbbb\n";
char str3[20] = "ccc\n";
char tmp[20] = "";
上記のような変数を用意し、tmpにそれぞれをコピーしようとしています。
正確にはファイルから1行読み取り、改行手前までのデータをコピーするのですが。
このとき、strncpy(tmp,str1,strlen(str1)-1); と strncpy(tmp,str2,strlen(str2)-1); までは
正常に動作するのですが、
strncpy(tmp,str3,strlen(str3)-1); を実行するとうまくできません。
strncpy(tmp,str1,strlen(str1)-1); → tmp : aaaaa
strncpy(tmp,str2,strlen(str2)-1); → tmp : bbbbbb
strncpy(tmp,str3,strlen(str3)-1); → tmp : cccbbb
str3をコピーして、tmpにcccだけを格納したいのですが、
どのようにすればいいのでしょうか。
環境はWindows2000で、コンパイラはbccです。
0588584
2005/06/20(月) 14:23:20get_head1 が脚の多い方。
get_head2 が脚の少ない方。
です。
0589デフォルトの名無しさん
2005/06/20(月) 14:24:47>588 は、 584 ではなく、>586の訂正。
0590デフォルトの名無しさん
2005/06/20(月) 14:27:100591586
2005/06/20(月) 14:29:560592582
2005/06/20(月) 14:44:15無いスレに誘導されても困ります。
0593デフォルトの名無しさん
2005/06/20(月) 14:53:40検索も出来ない人にageられても困ります。
0594582
2005/06/20(月) 14:56:09だったらURL張ってみてください。
最後まで検索かけましたが何か?
0595586
2005/06/20(月) 14:58:51/* 足の少ない方の動物の頭数を返す ( -1 == ERROR )*/
int get_head1(int feet1, int feet2, int all_head, int all_feet)
{
int tmp;
if(feet1 < 1 || feet2 < 1) return -1;
if( MIN(feet1, feet2) * all_head > all_feet ) return -1;
if( MAX(feet1, feet2) * all_head < all_feet ) return -1;
tmp = all_head * MAX(feet1, feet2) - all_feet;
if( tmp % MIN(feet1, feet2) != 0 ) return -1;
return tmp / MIN(feet1, feet2);
}
なお、get_head1 が脚の少ないほう、get_head2 が多いほうです。
すれ汚しスマソ。
0596582
2005/06/20(月) 16:08:19結局みつからないのならはじめから煽らないでください。
0597デフォルトの名無しさん
2005/06/20(月) 16:24:09いいから消えろ
.NETが見つからん言うてVCスレとか探してみたんかてめぇは
0598デフォルトの名無しさん
2005/06/20(月) 16:41:55|| ||
|| バカは放置! ||
|| 。 ΛΛ || / ̄ ̄ ̄ ̄ ̄ ̄ ̄
ハーイ! || \. (゚Д゚,,) < >>597さん、いいですね!
||________⊂ ∪ \_______
∧ ∧ ∧ ∧ ∧ ∧ | |
( ∧ ∧ ( ∧ ∧ ( ∧ ∧ UU~
〜(_( ∧ ∧ __( ∧ ∧__( ∧ ∧ ハーイ!
〜(_( ∧ ∧_( ∧ ∧_ ( ∧ ∧
〜(_( ,,)〜(_( ,,)〜(_( ,,)
〜(___ノ 〜(___ノ 〜(___ノ
0599デフォルトの名無しさん
2005/06/20(月) 17:15:29free(a);
としたら、*aを使うのは危険になりますが、aは大丈夫なのでしょうか?
つまりこのまま
a = 別のmallocで作られたポインタ;
等とするのは大丈夫なのでしょうか?
0600582
2005/06/20(月) 17:15:45だったらはなから.netスレ池とかかくなヴォケ
うまく誘導できないくらいならするなと言いたいだけだ。
まぁこんな糞なことしか議論できない低脳に聞いた俺が馬鹿だったって話なんだがな。
0601デフォルトの名無しさん
2005/06/20(月) 17:17:43aを再利用するのは問題ない
0602デフォルトの名無しさん
2005/06/20(月) 17:21:04自分で馬鹿言ってりゃ世話無いぜw
0603デフォルトの名無しさん
2005/06/20(月) 17:21:42ジサクジエンカコワルイ
0604デフォルトの名無しさん
2005/06/20(月) 17:23:50OK。キミはちゃんと変数を理解している。
希に、delete a; すると、
「aが使えない」「aにNULLが入る」等と勘違いする人がいる。
0605デフォルトの名無しさん
2005/06/20(月) 17:27:03誘導して欲しいなら、まずはこっちに行け。
【 質問誘導スレ 】
http://pc8.2ch.net/test/read.cgi/tech/1066747198/l50
0606デフォルトの名無しさん
2005/06/20(月) 17:29:23aはただの入れ物であり、free(a)で解放されるのはaに入れていたアドレスの先にある領域
aにはなんら影響を及ぼさない
余談だが、free(a)したら直後にa=NULLにしておくことをオススメする
0607デフォルトの名無しさん
2005/06/20(月) 17:56:380608584
2005/06/20(月) 18:20:23ですが…
C言語で連立方程式を解くに
はそんなにかかるんですか…
もっと勉強しなきゃ…or-z
実は授業で出た課題なんですが
scanf関数とかしかやってない
のにこれはちょっと無茶では
0609デフォルトの名無しさん
2005/06/20(月) 18:28:59連立王定式なら、もっと煩雑になるだろうな。
0610デフォルトの名無しさん
2005/06/20(月) 18:29:580611 ◆CDoPhxVDCI
NGNGdevice=%SystemRoot%\system32\ANSI.SYS
を追加したんですができませんでした。
OSはXPでコンパイラはフリーのBCCを使っています。
0612デフォルトの名無しさん
2005/06/20(月) 18:45:57command.comならいける
0613デフォルトの名無しさん
2005/06/20(月) 18:51:28XPのcommand.comから32ビットコンソールアプリを起動してもミリ。
0614デフォルトの名無しさん
2005/06/20(月) 18:56:360615デフォルトの名無しさん
2005/06/20(月) 18:57:08cmd.exeならあるんだが。
で、エスケープシーケンスで色つけたいなら端末エミュレータを使えばいい。
0616デフォルトの名無しさん
2005/06/20(月) 18:59:39ttp://kasai86.ld.infoseek.co.jp/dos/esc.htm
0617デフォルトの名無しさん
2005/06/20(月) 19:02:262001/08/28 12:00 64,814 command.com
0618デフォルトの名無しさん
2005/06/20(月) 19:03:25連立一次方程式。整数解のみ版
#include <stdio.h>
int main()
{
int a, b, c, d, e, f;
int x, y;
int v1, v2;
printf(">> ax + by = c\n");
printf(">> dx + ey = f\n");
printf("input [ a b c ] > ");
scanf("%d %d %d", &a, &b, &c);
printf("input [ d e f ] > ");
scanf("%d %d %d", &d, &e, &f);
v1 = e * c - b * f;
v2 = e * a - b * d;
if( v1 % v2 != 0 ) { printf("整数解はありません\n"); exit(1); }
x = v1 / v2;
v1 = c - a * x;
v2 = b;
if( v1 % v2 != 0 ) { printf("整数解はありません\n"); exit(1); }
y = v1 / v2;
printf("%dx + %dy = %d\n", a, b, d);
printf("%dx + %dy = %d\n", d, e, f);
printf("( x, y ) = ( %d, %d )\n", x, y);
return 0;
}
鶴亀計算するなら。
input [ a, b c ] = [ 1, 1, 頭の合計]
input [ d e f ] = [ 2, 4, 脚の合計] で
( x, y ) = ( 鶴の数, 亀の数 ) と出ます。
0619618
2005/06/20(月) 19:06:45下から5行目
誤> printf("%dx + %dy = %d\n", a, b, d);
正> printf("%dx + %dy = %d\n", a, b, c);
0620デフォルトの名無しさん
2005/06/20(月) 19:42:56関係演算子の説明で
"a < b aがbよりも小さければ1,そうでなければ0という値を生成する"
ってあるんですけど値って・・・。
単純に不等号だと思ってればいいんですよね?
0621デフォルトの名無しさん
2005/06/20(月) 19:47:40int a = 1, b = 2, c = a < b;
これでcに1が入るって事。
0622デフォルトの名無しさん
2005/06/20(月) 19:59:03それでもいいけど、0は偽・0以外は真ということを理解しといた方がいい。
0623デフォルトの名無しさん
2005/06/20(月) 20:04:59うぉ、ほんとだ
ちゃんと0か1出力しますね(;´Д`)
>>621さんありがとう
0624デフォルトの名無しさん
2005/06/20(月) 20:06:02つまりa < b < cなんてのが数学とは違う解釈になる。
0625デフォルトの名無しさん
2005/06/20(月) 20:08:340626デフォルトの名無しさん
2005/06/20(月) 20:10:23これらは、条件式では偽となる。
それ以外はすべて真。
Cにはブーリアン型がないので、これらをブーリアン「偽」の代用と
し、集合論の原理からそれ以外のすべての値は真となる。
しかし、定数としての真を定義しなければ、実装上厄介なため、
無数にある真値の中から代表として1を使用している。
0627620
2005/06/20(月) 20:21:07なるほど、数学の不等号と違うんですか・・。φ(`д´)メモメモ...
それでプログラムを作ったんですがエラーが・・・もうちょっと考えます。
0628デフォルトの名無しさん
2005/06/20(月) 20:25:42評価することができて、値が存在する何者か。
=は等式じゃなくて単に「代入する」んだし
代入式にも「式の値」が存在する。
0629620
2005/06/20(月) 20:29:49scanf("%d" , &n1);/*値を2つ取得*/
scanf("%d" , &n2);
n3 = n1 > n2; /*n3に値0,1のいずれかを取得させる*/
0630620
2005/06/20(月) 20:31:13n3 = n1 > n2; /*n3に値0,1のいずれかを取得させる*/
scanf("%d" , &n1);/*値を2つ取得*/
scanf("%d" , &n2);
としてたため、0しか吐いてくれませんでした(;´Д`)
629ので正確に0or1を吐いてくれます。皆さんありがとうございますた。
0631608
2005/06/20(月) 20:43:48>>618さん、ありがとうございます!
ほんとに助かりました!!
ところでmainのまえのintは
必要なのですか?
0632デフォルトの名無しさん
2005/06/20(月) 20:54:47間違ってもvoidなんて書くなよ。
0633608
2005/06/20(月) 20:57:03授業ではいきなりmain()...と書いていたのですが…
0634デフォルトの名無しさん
2005/06/20(月) 21:00:15main()と書くのはC89などではint main()とと書くの同義。
0635デフォルトの名無しさん
2005/06/20(月) 21:33:060636608
2005/06/20(月) 21:34:330637608
2005/06/20(月) 21:41:21どうやって使うんでしょうか…
なんか自分のPCでもコンパイルとかしてみよう
と思ってダウンロードしてみたのですが
コマンドとか良くわからないもので…
学校のlinuxならやり方は当然習っているのですが
ためしに画面にgccと打ち込んでみる…or-z
0638デフォルトの名無しさん
2005/06/20(月) 21:49:11http://homepage1.nifty.com/kazubon/progdoc/poor/vctoolkit.html
ググったりしようよ。
0639デフォルトの名無しさん
2005/06/20(月) 21:49:290640デフォルトの名無しさん
2005/06/20(月) 22:15:44いっそ cygwin 入れて gcc 使えば?
0641デフォルトの名無しさん
2005/06/20(月) 22:17:340642デフォルトの名無しさん
2005/06/20(月) 22:24:33察してやれよ
0643デフォルトの名無しさん
2005/06/20(月) 23:32:51b.これでも自分が一番詳しい
う〜ん、その他は?
0644デフォルトの名無しさん
2005/06/20(月) 23:36:53この様に型が定義されていて
VILLA *vlopen(const char *name, int omode, VLCFUNC cmp);
この様にその型の関数を使う関数のあるライブラリがあるのですが,
マニュアルによると上の定義で関数を書いてvlopenに指定しろ、との事なのですが
例えばどう書けば良いのでしょうか?
0645デフォルトの名無しさん
2005/06/20(月) 23:36:550646デフォルトの名無しさん
2005/06/21(火) 00:00:45int xxx(const char *aptr, int asiz, const char *bptr, int bsiz)
{
}
0647644
2005/06/21(火) 00:27:36レスありがとうございます。
そう書いておいて
VILLA *vlopen(const char *name, int omode, xxx);
とすれば良いのでしょうか?
実際に試してみたところエラーは出ないのですが、関数の結果におかしな所があるので
合ってるかどうか良く分からないんです。
0648デフォルトの名無しさん
2005/06/21(火) 00:32:060649デフォルトの名無しさん
2005/06/21(火) 05:17:45C の sqrt に関する情報を集めるといいことがあるかも。
0650デフォルトの名無しさん
2005/06/21(火) 05:26:070651デフォルトの名無しさん
2005/06/21(火) 06:10:09例えば、以下のようなときです
・x1,x2,x3を取得し最小値を出力する。
#include<stdio.h>/*最小値を取得8*/
int main(void)
{
int x1 , x2 , x3 , min;
/*値を3つ取得*/
scanf("%d" , &x1);
scanf("%d" , &x2);
scanf("%d" , &x3);
min = (x1 < x2) ? x1 : x2;
min = (x3 < x2) ? x3 : x2;
printf("最小値は%dです。" , min);
return (0);
}
としましたが2番目のmin が反映されません・・・。
0652651
2005/06/21(火) 06:16:07min = (x2 < x3) ? x2 : x3;
と修正してもダメです(;´Д`)
0653デフォルトの名無しさん
2005/06/21(火) 06:19:22最小値もとめるならこうじゃないのか?
min = (x1 < x2) ? x1 : x2;
min = (min < x3) ? min : x3;
0655デフォルトの名無しさん
2005/06/21(火) 08:29:000656デフォルトの名無しさん
2005/06/21(火) 11:59:30ただし,底辺の長さ,高さ,面積の値を入れる変数名をそれぞれteihen, takasa,mensekiとし,いずれも実数型(double型)とする.
void main( void )
{
double teihen, takasa, menseki;
printf( "底辺は?\n" ); /* 入力を促すメッセージを表示 */
scanf( "%d", &teihen );
menseki = teihen * takasa / 2;
printf("%f\n",menseki);
}
これ誰か完成させてくれ
0657デフォルトの名無しさん
2005/06/21(火) 12:14:18ffblkという型の構造体を用意するとかかれていました。
ff_ftimeやff_fdateはどういう状態なのかを書いたサイトがあったのですが、
ff_reservedは調べてみてもよくわかりませんでした。
これってなんなんですか?
0658デフォルトの名無しさん
2005/06/21(火) 12:24:34マルチすなや。
0659デフォルトの名無しさん
2005/06/21(火) 12:32:04「予約済み領域」ではないかと思われ。
0660デフォルトの名無しさん
2005/06/21(火) 13:41:01とりあえずは、ここが近いと思い書かせてもらいます。
今、nmakeを使ってデータのみをコンパイルしたいと思い、
サクサクとコードを記述したのですが、C++コンソールで作成しました
ツールを動作させますと、実行結果は問題ないのですが、
下記のエラーが必ず出てしまいます。
nmake : fatal error U1077: 'fpatch.exe' : リターン コード '0x1f' Stop.
更に下記にnmake側のコードを記述します。
#**************************************
T= c:
#**************************************
ALL:\
$(T)\test.bin
#**************************************
$(T)\test.bin:
fpatch.exe
#**************************************
※fpatch.exe はc++コンソールで作成しました自ツールです。
試しに単なるprintf文だけ表示させるだけの実行ファイルを
fpatch.exeを入れ替えてnmakeを実行させますと
printfの内容は表示されるものの、やはり同じエラーが返ってきます。
開発環境でのOSはWindows2000ですが、何か問題があるのでしょうか?
0661デフォルトの名無しさん
2005/06/21(火) 13:43:340662660
2005/06/21(火) 13:47:41どうも消されてしまっているようなので、
#**************************************
ALL:\
$(T)\test.bin ←タブ
#**************************************
$(T)\test.bin:
fpatch.exe ←タブ
#**************************************
書いときます。すみません;;
0663デフォルトの名無しさん
2005/06/21(火) 13:48:31そのメッセージのとおり、fpatch.exeの戻り値が31になってるんじゃないの?
main()の最後でちゃんとreturn 0してる?
0664デフォルトの名無しさん
2005/06/21(火) 13:50:13実装が難しいからだハゲ
0665660
2005/06/21(火) 14:22:26ぉおおおお!
main()側は確かに戻り値は指定していませんでしたので、
早速、修正しましたら、エラーがでなくなりました;;
なんと・・・戻り値がないだけで、エラーってましたか・・;;
素早い対応、感謝感激であります;;
0666デフォルトの名無しさん
2005/06/21(火) 14:41:46あのねぇ……
main()の戻り値(=exit()の引き数)はOSに対するエラー通知に使われるわけ。
makeツールはそれを実行したプロセス(この場合fpatch.exe)のエラー情報として使うわけ。
#まぁ、まともなmakeツールならそれを無視することもできるだろうけどね。
0667デフォルトの名無しさん
2005/06/21(火) 15:05:15正常処理の場合は0返さなきゃダメよ。
0668デフォルトの名無しさん
2005/06/21(火) 15:06:37著/高橋 麻奈 やさしいC 第二版の49ページに基本形の表が書いてあるのですが、
long intとintの差がわかりません。
両方とも記憶できる値の範囲例が
int -2147483648~2147483647
long int -2147483648~2147483647
となっています。
これはintとlong intは同じと考えて良いのでしょうか?
0669デフォルトの名無しさん
2005/06/21(火) 15:09:05今現在の大抵の環境では、偶偶同じ長さというだけ。
また、同じという前提で書かれたプログラムも多数あるので注意。
0670デフォルトの名無しさん
2005/06/21(火) 15:42:2516bitコンパイラだと
int -32768~32767
long int -2147483648~2147483647
になったりする
0671デフォルトの名無しさん
2005/06/21(火) 15:59:230672デフォルトの名無しさん
2005/06/21(火) 16:17:19strtok()が返すポインタは、引数として渡した文字列のどっかを指している。
で、strtok()の仕様上、readonlyな文字列を渡すことができない。
というわけで、問題はないはず。
0673デフォルトの名無しさん
2005/06/21(火) 16:20:53strtok()が返すのはあんたが用意したメモリ空間だから構わないっちゃ構わないが、
混乱する元だから止めておいたほうがいいよ。
#つーか、strtok()自体スレッドセーフじゃないからお勧めできない。
0674デフォルトの名無しさん
2005/06/21(火) 16:22:40規格で決まってるのは
1) shortは最低16bit
2) longは最低32bit
3) sizeof short <= sizeof int <= sizeof long
ってことだけ。
16bitや64bitの環境を考慮する場合は気をつけろ。
0675デフォルトの名無しさん
2005/06/21(火) 16:24:32strtok()のスレッドセーフ版がstrtok_r()の場合もあるが、
Microsoft VC++のように、マルチスレッド版のCランタイムでは
strtok()という同じ名前でスレッドセーフにしている場合もある。
まあ、推奨しないのは俺も同感だがな。
0676デフォルトの名無しさん
2005/06/21(火) 16:28:03単語の終わりに0入れたら、次のstrtok呼び出し時、困るような気がするのですが。
文字列サイズが含まれてるわけでもないのに。
0677デフォルトの名無しさん
2005/06/21(火) 16:31:20libcのソースを見てもらうのが手っ取りはやいのだが
(VC++にもlibcのソースはついている)
典型的な、スレッドセーフ*でない*実装では、
次のトークンを指すstaticなポインタを内部で保持しとるのだよ。
それがトークン区切りの'\0'の後を指してるから、問題は無いわけ。
0678デフォルトの名無しさん
2005/06/21(火) 16:32:33疑問を感じたら実装に当たろう。
ソースを見れば一目瞭然。随分危ない橋を渡っているのが分かるはず。
0679デフォルトの名無しさん
2005/06/21(火) 16:38:08てことは、intが24bitなことも有りうる?
0680デフォルトの名無しさん
2005/06/21(火) 16:45:17レスThanks
0681デフォルトの名無しさん
2005/06/21(火) 16:46:49スレッドはシングル(コンソール)なので問題ないです。
0682デフォルトの名無しさん
2005/06/21(火) 16:48:18int=24ビットは実在するね。
http://www.chris-lott.org/resources/cstyle/indhill-cstyle.html
の、「Portability」の表を参照。
0683デフォルトの名無しさん
2005/06/21(火) 16:49:37規格上は有り得る。が、常識的な実装上はまずない。
0684683
2005/06/21(火) 16:50:30「まずない」→「余りない」
勢い余っちまったw
0685デフォルトの名無しさん
2005/06/21(火) 17:08:19int* a = buf;
i = i+0x800; //800h加算される
a= a+0x800; //何故か0C80h加算される
aにbufオフセット800hをセットしたいのですがどうやればいいのでしょうか?
ちゃんと800h加算された事もあるのですが・・・・・・
0686デフォルトの名無しさん
2005/06/21(火) 17:11:31うおー
おもしれー
0687デフォルトの名無しさん
2005/06/21(火) 17:21:26pがポインタのとき、p+1はpの「次の要素」を指すポインタ。
つまり、pをsizeof (*p)バイト進めたもの。
明示的にアドレスをいじりたいなら、
a = (int *)((char *)buf + 0x800);
とでもするといい。
0688デフォルトの名無しさん
2005/06/21(火) 17:26:582000h加算される、とかなら分かるのだが
0690デフォルトの名無しさん
2005/06/21(火) 17:31:04すみません、今みたら2000hになってました。
int* a = a+0x0800としてみたり、
int a = buf+0x800としたりやってたんで、間違いました。
0691デフォルトの名無しさん
2005/06/21(火) 17:49:21charが9ビットだったらsizeof(char)はいくつになるの?
っていうか((char *)buf + 0x800)がどうなるのか知りたい。
0692デフォルトの名無しさん
2005/06/21(火) 17:50:32sizeof(char)は必ず1になる。
0693デフォルトの名無しさん
2005/06/21(火) 17:51:52sizeof(char)は常に1だ。
仮にそれが9ビットだとしても変わらない。
0694デフォルトの名無しさん
2005/06/21(火) 18:03:39今リスト構造というのを勉強してるのですが、
試行錯誤の末、↓のサンプルを作りました。
http://www.vipper.org/vip37005.txt
↑には
struct list * pop (struct list *pListTop , int &nNum)
という関数があります。
これはリストの前列の値をとりだして、
その後不要なメモリを削除する関数です。
取り出した値は第二引数の int &nNum に入れてるのですが、
戻り値をint型にするにはどうすればいいんでしょうか?
int pop (struct list *pListTop)
こんな感じで、取り出した値を戻り地にしたいんですが・・
わかりにくいプログラムで申し訳ありませんが、
どなたかお願いします m(__)m
0695デフォルトの名無しさん
2005/06/21(火) 18:07:28>int pop (struct list *pListTop)
ってすればいいじゃん。
何がわからないんだ?
0696デフォルトの名無しさん
2005/06/21(火) 18:08:46というのはさておき
int pop(struct list**pListTop);
として、pListTopを値/結果引数にすると良いだろう。
ob1 = pop(ob1, nNum);
のようなコードのかわりに
nNum = pop(&ob1);
と書ける。
0697デフォルトの名無しさん
2005/06/21(火) 18:14:04レスどうもです。
>>695
それだと pListTopのアドレスが変わらないので、
結果がヘンになってしまっていたのです orz
>>696
実はこの後クラスにするつもりだったんですが、
リスト構造は初めてのため、理解するために
まず構造体で作ったたのですが・・
** だと、関数の中でアドレスを変えたら
呼び出し先のアドレスも変化するのでしょうか?
ちょっと今からやってみます。
0698デフォルトの名無しさん
2005/06/21(火) 18:18:02呼び出し側の値を書き換えたければポインタ/参照渡し。これ基本。
swap()の例ぐらいは流石にしってるでしょ?
struct list *pListTopを書き換えたければ&pListTopを渡す。
で、その型はstruct list**
ただそれだけのこと。
0699デフォルトの名無しさん
2005/06/21(火) 18:37:360700デフォルトの名無しさん
2005/06/21(火) 19:35:56なんとかできました m(__)m
ポインタのポインタは使ったこと無いので、
記述方を調べるのに時間かかってしまいました。
これで大丈夫でしょうか?
int pop (struct list **pListTop)
{
struct list *pOldList; // リスト削除用
int nNum;
// リストが空の場合
if (*pListTop == NULL) {
cout << "リストは空です\n";
nNum = 0; // なんとなく0を入れとく
return nNum;
}
pOldList = *pListTop; // 取り出したあと削除するため、今のアドレスを保存
nNum = (**pListTop).num_data;
*pListTop = (**pListTop).nextlist; // 最前列のアドレスを、一個前のアドレスに変える
delete pOldList; // 値を取り出したので削除
return nNum;
}
あと、swap()の例とかいうの、知らない orz
>>699
はい。次はそれに挑戦してみます。ども。
0701デフォルトの名無しさん
2005/06/21(火) 20:39:40{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}
すべての場合を尽くして
{1,1,1,1,1,1,1,1,1,1}
にするためのアリゴリズムがわかりません・・。
どなたかご教授願います。(わかりにくい文章ですみませんorz)
0702デフォルトの名無しさん
2005/06/21(火) 20:44:4610ケタの3進数と考えればいいんじゃない?
0703デフォルトの名無しさん
2005/06/21(火) 22:08:52C++の<algorithm>にstd::next_permutation()なんてのがある。
0704デフォルトの名無しさん
2005/06/21(火) 22:24:26案1.再帰を使う
void set(int *target, int idx)
{
if(idx==10) { /* 処理 */ }
else {
int i;
for(i=-1;i<=1;i++) { target[idx] = i; set(target, idx+1); }
}
}
int main(void) { int array[10]; set(array, 0); }
案2.再帰をループに展開する
案3.ほぼ等価になるような気もするけど >702
int i, array[10];
for(i=0;i<10;i++) array[i]=-1;
do {
/* 処理 */
++array[0];
i=0;
while(i<10 && array[i]==2) { array[i]=-1,++array[++i]; } /* 繰り上がり処理 上の代入と合わせて for 文にすることも可能 */
} while(i<10);
0705デフォルトの名無しさん
2005/06/21(火) 23:14:23#include <stdio.h>
void
foo(int m[], unsigned n)
{
for (unsigned i = 0; i < 10; ++i) {
m[i] = (n % 3)-1;
n /= 3;
}
}
int
main()
{
// 3^10 = 59049
int m[10];
for (unsigned i = 0; i < 59049; ++i) {
foo(m, i);
for (unsigned j = 0; j < 10; ++j) {
printf("%2d ", m[j]);
}
printf("\n");
}
return 0;
}
0706デフォルトの名無しさん
2005/06/22(水) 00:27:126B 61 67 65 2E 62 6D 70 00 00 00 00 00 00 00 00 kage.bmp........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
50 00 00 00 44 32 3C 00 30 09 00 00 00 00 00 00 P...D2<.0.......
6B 61 67 65 2E 78 00 00 00 00 00 00 00 00 00 00 kage.x..........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
このようなArchiveファイルのインデックスをメモリに読み込みました。
4hからの4バイトがArchive内の位置、8hからがファイルサイズ、
10hからがファイル名です。
void list(int *a)
{
int i;
int b = (archivesize - 0x0800 - 0x100)/0x050; //アーカイブ内ファイル数
a = a+0x200; //ファイル先頭
for(i=0;i < b;++i){
printf("%s\t%10d\t%d\n",&a[4], a[2], a[1]);
a = a+0x14; //NEXTレコード(1レコード50hバイトなので)
}
}
これを構造体として扱いたいのですが、どうすればいいのでしょうか?
0708デフォルトの名無しさん
2005/06/22(水) 00:36:38struct{
DWORD id;
DWORD pos;
LONGLONG filesize;
BYTE fname[0x40];
}
0709デフォルトの名無しさん
2005/06/22(水) 00:45:15struct record {
Byte mark[4];
unsigned int32_t offset;
unsigned int32_t length;
unsigned int32_t dummy;
Byte fileName[0x40];
};
0710デフォルトの名無しさん
2005/06/22(水) 01:06:18マニュアルで#pragma、pack見てるのですが解りません。
宣言ですよね?
WisdomSoftなどを参考に、最初↓こんな感じで書きました。
struct fillist{
int ID;
int pos;
int filesize;
int dum;
char name[0x40];
}
struct fillist a{
a.ID = //どうしてよいやら・・・・・・
0711デフォルトの名無しさん
2005/06/22(水) 01:26:57地道にメンバごとに読み込んでくのが以下略。
0712706、710
2005/06/22(水) 04:11:44{
typedef unsigned char Byte;
struct record {
Byte mark[4];
unsigned int pos;
unsigned int len;
unsigned int dummy;
Byte fileName[0x40];
};
int i;
int b = (decsize - 0x0800 - 0x100)/0x050;
struct record *ptr;
ptr = a;
ptr = (char *)ptr+0x0800;
for (i = 0;i < b;++i) {
printf("%s\t\t%d\t%d\n", ptr->fileName, ptr->len, ptr->pos);
ptr = (char *)ptr+0x50;
}
}
これで一応動いたんですけど、これでいいのでしょうか?
何故構造体で扱いたかったかと言うと、Win32APIのlistviewでファイル選択
したかったからなのです。
0713デフォルトの名無しさん
2005/06/22(水) 05:05:54てかBYTEは既にWINDEF.hでtypedefされとるんだからそれ使えばええじゃろ
0714709
2005/06/22(水) 06:08:010715デフォルトの名無しさん
2005/06/22(水) 06:46:100716デフォルトの名無しさん
2005/06/22(水) 07:09:530717デフォルトの名無しさん
2005/06/22(水) 07:17:00unsigned int32_t って大丈夫?
uint32_t じゃない?
あと、 int32_t 使うなら Byte も uint8_t でいいんじゃね?
0718デフォルトの名無しさん
2005/06/22(水) 07:23:250720デフォルトの名無しさん
2005/06/22(水) 09:44:370721デフォルトの名無しさん
2005/06/22(水) 15:07:53fprintf(fp,"sentence\n");
としたとき、\r\nに書き換わりますが、どういう仕様なのでしょうか?
strstr(str,"\n");としたときや、
strlen(str);// str="123\n"
strtok(str,"\n"); など
どのように処理されるか疑問です。処理系によるんでしょうか。
置換処理だけで、あとはそのままの処理('\n'なら'\n'で'\r'なら'\r'で'\r\n'なら'\r\n')の
気がしますが。
説明下手かもしれません。
0722デフォルトの名無しさん
2005/06/22(水) 15:14:26テキストモードでオープンされたファイルに対し、
書込時には'\n'を'\r'+'\n'のコードに、
読込時には'\r'+'\n'を'\n'のコードに、
それぞれ置き換えているだけ。
プログラム内部では'\n'は'\n'で'\r'は'\r'だ。
0723デフォルトの名無しさん
2005/06/22(水) 15:30:07\r\nだったような気がしますが?
0724デフォルトの名無しさん
2005/06/22(水) 16:24:51バイナリモードでファイルを開いていれば、そうなるわなあ
テキストモードなら、行末は\nで終端だよ
その辺は、libcの中でも、stdioよりもっと低レベルの層でやってる。
0725デフォルトの名無しさん
2005/06/22(水) 19:12:31text.txt内:"100\r\n" -> つまり、100と改行のみ
int main(void)
{
char buffer[256];
FILE* fp = fopen("text.txt","r");
fgets(buffer,256,fp);
printf( "%d\n", strtol(strtok(buffer,"\r"),0,10) );
printf( "%d\n", strstr(buffer,"\r") );
return 0;
}
結果は
100
0
でした。
strstrは、予想通りの結果で、strtokは\rでも区切りに成功してます。
0726デフォルトの名無しさん
2005/06/22(水) 19:22:52ところで、このコードの実行結果について、どうおもう?
char p[]="100";
printf( "%d\n", strtol(strtok(p,"\r"),0,10) );
printf( "%d\n", strstr(p,"\r") );
0727デフォルトの名無しさん
2005/06/22(水) 19:24:320728デフォルトの名無しさん
2005/06/22(水) 19:30:590729デフォルトの名無しさん
2005/06/22(水) 19:38:57「ハッシュ関数」で検索。
0730デフォルトの名無しさん
2005/06/22(水) 19:42:350731デフォルトの名無しさん
2005/06/22(水) 19:59:32ダンプイメージで確認してみろ。
0732デフォルトの名無しさん
2005/06/22(水) 20:05:030733デフォルトの名無しさん
2005/06/22(水) 21:07:021 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
・・・
みたいにずれてしまいます。もう少しきれいに表示させるのはムリなんですか?
0734デフォルトの名無しさん
2005/06/22(水) 21:08:56数字と数字の区切りにタブを使ったり、フィールド幅を指定したりすればいい。
0735デフォルトの名無しさん
2005/06/22(水) 21:08:59%2d
0736デフォルトの名無しさん
2005/06/22(水) 21:09:150737デフォルトの名無しさん
2005/06/22(水) 21:12:26すごい、それでうまくいきました、ありがとうございます。
>>734
それは、まだ知らないです(;´Д`)勉強します。
0738デフォルトの名無しさん
2005/06/22(水) 21:27:43フィールド幅の指定は>>375の通り
0739デフォルトの名無しさん
2005/06/22(水) 21:35:04class 文字列 クラス名というのを見かけるのですが
この文字列はどういったものなのでしょうか?
0740デフォルトの名無しさん
2005/06/22(水) 21:38:130741デフォルトの名無しさん
2005/06/22(水) 21:38:20ありえねーっつーの
0742デフォルトの名無しさん
2005/06/22(水) 21:43:47のこと?
0743デフォルトの名無しさん
2005/06/22(水) 21:45:55すみません。
class _EXP Foo {
Foo();
}
こんな感じなのですが・・・あまり詳しくなってません
0744デフォルトの名無しさん
2005/06/22(水) 21:59:300745デフォルトの名無しさん
2005/06/22(水) 22:03:29ありがとうございます。
検索してみます
0747デフォルトの名無しさん
2005/06/22(水) 22:17:40なるほど、理解が深まります。
ありがとうございました
0748デフォルトの名無しさん
2005/06/22(水) 22:43:080749デフォルトの名無しさん
2005/06/23(木) 01:42:420750デフォルトの名無しさん
2005/06/23(木) 02:32:03static unsigned long *Data = NULL;
static int X, Y;
:
:
int size = sizeof(unsigned long) * X * Y;
Data = (unsigned long *)malloc(size);
のmallocの部分をnewにするにはどう組み替えればできまつか?
new unsigned long (size)とか試してたんでつが、できる気配もなく・・・
0751デフォルトの名無しさん
2005/06/23(木) 02:37:080752デフォルトの名無しさん
2005/06/23(木) 02:39:33Data = new unsigned long[X*Y];
:
:
delete [] Data; //← delete Data; じゃだめよ
0753デフォルトの名無しさん
2005/06/23(木) 03:04:18なんと[]で囲むのでつか。
deleteのほうもなるほど・・・お二人共ありがとうございますだ。
0754デフォルトの名無しさん
2005/06/23(木) 07:07:380755デフォルトの名無しさん
2005/06/23(木) 08:41:46という関数で lpBuffer の代わりに string buf を使うことは出来ませんか?
0756デフォルトの名無しさん
2005/06/23(木) 10:10:350757デフォルトの名無しさん
2005/06/23(木) 10:16:47書き込む前に試したけど無理でした。
'const char *' から 'LPTSTR' に変換できない
というコンパイルエラーが出ます。
0758デフォルトの名無しさん
2005/06/23(木) 10:41:24LPTSTRはtypedef TCHAR *LPTSTRなので
const char* c_str()は渡せない(constが邪魔)
間違っても::GetVersionString(const_cast<char*>(buf.c_str());
とかやらないでね
0759デフォルトの名無しさん
2005/06/23(木) 11:07:23CString,CList,CArrayを用意するくらいだからな。
素直にTCHARの配列渡せばいい。どうせ頻繁に呼ぶわけじゃないんだし。
0760デフォルトの名無しさん
2005/06/23(木) 11:22:48> マイクロソフトはSTL敬遠してる
はつみみです。
0761デフォルトの名無しさん
2005/06/23(木) 11:25:35携帯JAVAから入ったC++初心者なのですが、
class CHoge{
public:
static int test(){
return 0;
}
}
void main(){
int a = CHoge.test();
}
とやりたいのですが、JAVAと違ってC++ではうまくいきません。
もちろん言語が違うのでC++の作法に合わせなければと思ったのですが、VC6.0が
「error C2275: 'hoge' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。」
これが理解できません。
そんなアクセス演算子使ってないorz
どなたかご教授お願いできますでしょうか。
C++のサイトを見て回った感じ、私のやりたいことをやるには。
void main(){
CHoge hoge;
int a = hoge.test();
}
とすればよいように見えるのですが、なるべくならCHogeのメソッドをそのまま呼べるのが嬉しいです。
0762デフォルトの名無しさん
2005/06/23(木) 11:28:47int a = CHoge::test();
C++ではクラス名の後には::をつける。
0763デフォルトの名無しさん
2005/06/23(木) 11:29:46CHoge::test()
C++はメンバアクセスの演算子が場合に応じて色々。これはおぼえるしかない。
0764デフォルトの名無しさん
2005/06/23(木) 11:36:31ありがとうございます!
早速試してみたらうまくいきました(`・ω・´)
0765デフォルトの名無しさん
2005/06/23(木) 12:28:33*
***
*****
・・・
と表示させるプログラムは出来たんですけど、これを
*
***
*****
みたいに中央寄せ?はできないのでしょうか・・・?
初歩っぽい質問ですいません。
0766765
2005/06/23(木) 12:31:56-***-
*****
みたいに三角にってことです。火狐でずれた;;
(-は見やすいように書きました)
0767デフォルトの名無しさん
2005/06/23(木) 12:33:39そうなるようにプログラムを組めば出来るよ。
0768デフォルトの名無しさん
2005/06/23(木) 12:40:040769デフォルトの名無しさん
2005/06/23(木) 12:46:27痛いところを(;´Д`)
とりあえずもう少しやってみます。
0770デフォルトの名無しさん
2005/06/23(木) 12:56:43#include<stdlib.h>
#include<string.h>
void main()
{
char ary[10];
strcpy(ary ,"1.23456");
double dig;
dig = atoi(ary);
printf("%lf\n", dig);
}
これをやっても小数が代入されずに値が1.000000になってしまいます。
小数でなければうまくいくのですが…。
0771デフォルトの名無しさん
2005/06/23(木) 12:58:060772デフォルトの名無しさん
2005/06/23(木) 13:00:48>void main()
この辺とか
>printf("%lf\n", dig);
この辺、要注意で。
0773デフォルトの名無しさん
2005/06/23(木) 13:07:42C++ではnewはアドレスを返すんで、Hogeクラスのオブジェクトを生成するとき
Hoge * pobj = new Hoge();
ってやって、メンバへのアクセスは
pobj->func();
とかやるわけですが、JAVA風に参照で書きたくて
Hoge & obj = * new Hoge();
というふうにやって
obj.func();
という感じでメンバにアクセスすることを考えてみました。
BCC5.5では基本的にきちんと動くようです。
こういうやり方に何か問題点とかありますか?
たとえば余計なコンストラクタが呼ばれるとかメモリを余分に使うとかそういう類。
その他にも、保守性、可読性、生産性、互換性などに関しても気になります。
ばかげた質問かもしれませんが、アドバイスよろしくお願いします。
0774デフォルトの名無しさん
2005/06/23(木) 13:07:55考えてみよう。
その表示を見ると、
・左側の空白
・アスタリスクの列
・右側の空白
の三つに分けられる。
左側の空白はn段のときはn-1, n-2, ... 0、
アスタリスクは同じように1, 3, ... 2*n-1、
右側の空白も左側と同じだけ、記号が並んでいる。
と言うことは、
for (int i = 0; i < n; ++i) {
}
というループを考えるならそれぞれ、n-1-i, 2*i+1,n-1-i個ということだ。
従って、ループの中身は
for (int j = 0; j < n - 1 - i; ++j) {putchar('-');}
for (int j = 0; j < 2 * i + 1; ++j) {putchar('*');}
for (int j = 0; j < n - 1 - i; ++j) {putchar('-');}
putchar('\n');
ということになる。
この辺りをベースに、もっと要領のいい方法がないか模索してもいいね。
0775デフォルトの名無しさん
2005/06/23(木) 13:10:07>JAVA風に参照で書きたくて
この辺が間違い。
つーか、本当にnewする必要があるかどうか検討してみよう。
例えばローカルに必要なオブジェクトなら、
int anyFunction()
{
Hoge obj;
...;
}
だけで充分なわけだ。
#クラスが巨大なら話は別だが。
0776デフォルトの名無しさん
2005/06/23(木) 13:10:30void main()では何かまずいことでもあるんですか?
値を返さないので別に問題ないと思いますが…。
printf("%lf\n", dig);
よくみたらlいりませんね。
printf("%f\n", dig);これでもOKでした。
0777デフォルトの名無しさん
2005/06/23(木) 13:11:33for (int j = 0; j < n - 1 - i; ++j) {putchar('-');}
for (int j = 0; j < 2 * i + 1; ++j) {putchar('*');}
for (int j = 0; j < n - 1 - i; ++j) {putchar('-');}
↑この辺が顔文字っぽくて可愛いw
0778デフォルトの名無しさん
2005/06/23(木) 13:13:06C/C++の仕様では、intの戻り値を返すことが決められている。
承知の上で無視するなら兎も角、きちんと理解しておくことをお勧めする次第。
0779デフォルトの名無しさん
2005/06/23(木) 13:13:52そうそう。
破棄するタイミングを調整したいなら複文化すればいいしね。
0780デフォルトの名無しさん
2005/06/23(木) 13:14:56int main ()
{
return 0;
}
なるほど、こっちのほうがいいということですね。
0781773
2005/06/23(木) 13:20:32> この辺が間違い。
> つーか、本当にnewする必要があるかどうか検討してみよう。
もちろん本当にnewする必要がある場合の話です。
たとえば大量のインスタンス作る必要があるときなどは当然newする必要があると思います。
おっしゃる通りクラスが巨大な場合もあるでしょう。
コードを簡略化したので無駄なことをやっているように見えたかもしれませんが、実際には本当に必要な場面を想定してほしかったです。
説明不足ですみません。
とりあえず
Hoge & obj = * new Hoge();
というステートメントに焦点を充ててもらえたらと思います。
0782デフォルトの名無しさん
2005/06/23(木) 13:37:24deleteするとき delete &obj; なんて書かなきゃならんし
なにより他の人が見て混乱しそうだ。
0783デフォルトの名無しさん
2005/06/23(木) 13:41:04問題ない。
0784デフォルトの名無しさん
2005/06/23(木) 14:03:53C++ではint main()以外も禁止されてねーぞ。
0785デフォルトの名無しさん
2005/06/23(木) 14:09:44自分もJavaを触ることの方が多いけど、
Hoge & obj = * new Hoge();
C++でこんな書き方する奴がそばにいたら、蹴とばします。
0786デフォルトの名無しさん
2005/06/23(木) 14:11:13objを配列化に変更するとき面倒。
うっかり std::vector<Hoge> foo みたいなコンテナに入れて酷い目に。
0787デフォルトの名無しさん
2005/06/23(木) 14:12:33It shall have a return type of type `int', but otherwise its type is implementation-defined.
ってあるんだけど。3.6.1の2ね。
0788773
2005/06/23(木) 14:13:02> 破棄するタイミングを調整したいなら複文化すればいいしね。
ちょっと意味がわからないです。
すみません。
>>782
そうですね。
delete するときは delete * obj; なので、宣言するときと破棄するときの2点だけは気をつけないといけなくなってしまいますね。
ただその他の点では可読性に関して利点があるように思います。
とりあえずC++でインスタンスを参照によってアクセスすることで、変数が「ポインタであるかどうかの識別」が必要なくなるのではないかと考えました。
「参照かどうかの識別」は大概必要ないですし。
ポインタに慣れていればいるほど無意味さを感じるかと思いますが、全てのメンバに同じ方法でアクセスできるようになることは利点ではないかと。
例えば関数の引数でオブジェクトを参照渡しする場合など、呼び出し前の姿と呼び出し後の姿が同じになるわけです。
そういう意味でなるべく参照で扱うということによる利点はあるのではないかと思いました。
保守性に関しては微妙ですねw
0789デフォルトの名無しさん
2005/06/23(木) 14:14:16俺は>>781じゃないけど、何でそれがまずいのか教えて欲しい。
0790773
2005/06/23(木) 14:24:11う、たしかにそれはイタイですね・・・。
テンプレートへの対応がかなりマズそうですね。
あ、あとdelete & obj;ですね。寝ぼけてました。
そろそろ吊ってくる時間かもです。
おやすみなさい。
>>785
わかってて言っているのか謎ですが、とりあえず屋上でケツでも晒して這い蹲って待ってます。
0791775
2005/06/23(木) 14:36:23例えば、
関数の途中でオブジェクトを破棄しておきたい場合、
int func()
{
Hoge * foo = new Hoge;
...;
delete foo;
...;
return 0;
}
となる。これを、newを使わない場合は
int func()
{
{// from
Hoge foo;
...;
}// to
...;
return 0;
}
とすればfrom突入で生成されてto脱出で破棄されることが保証される。
私が言いたいのは、C++なんだから郷に入れてはってことでJAVA風に書くことに拘るのが間違い、と言うこと。
0792デフォルトの名無しさん
2005/06/23(木) 14:43:14そういう話じゃないんじゃないか?
newの結果を参照で受けることの利点欠点を論じろよ。
0794デフォルトの名無しさん
2005/06/23(木) 14:55:48可読性に関する反論もあるけど(>>788)。
まー今更どーでもいーけど。
0795デフォルトの名無しさん
2005/06/23(木) 16:07:23入れるにはどうしたらいいですか?
0796デフォルトの名無しさん
2005/06/23(木) 16:36:15char buf[100] = "for example:":
sprintf(strchr(buf, '\0'), "%d", a);
0797デフォルトの名無しさん
2005/06/23(木) 16:53:17ありがとうございます。できました。
0798デフォルトの名無しさん
2005/06/23(木) 16:54:19人気がある関数なんですか?
0799デフォルトの名無しさん
2005/06/23(木) 16:56:32人気がある関数なんですか?
0800デフォルトの名無しさん
2005/06/23(木) 17:10:370801デフォルトの名無しさん
2005/06/23(木) 17:11:32ケツにブツブツができてるのを見てからいまいち…
0802デフォルトの名無しさん
2005/06/23(木) 17:14:56snprintf()が標準じゃないから。
0803デフォルトの名無しさん
2005/06/23(木) 17:17:54ナマナマしい体験ありがとう
0804デフォルトの名無しさん
2005/06/23(木) 17:18:370805デフォルトの名無しさん
2005/06/23(木) 17:20:11ちょっと待て!PCの前に座ってるとケツにブツブツができるのか!?
0806デフォルトの名無しさん
2005/06/23(木) 17:20:45strrchr() で \0 がひっかけられることを初めて知ったC歴12年の自分。
0807デフォルトの名無しさん
2005/06/23(木) 17:21:14あせもみたいなもんじゃないかな?
0808デフォルトの名無しさん
2005/06/23(木) 17:26:050809デフォルトの名無しさん
2005/06/23(木) 17:28:020810デフォルトの名無しさん
2005/06/23(木) 17:30:33>>801はケツを洗わない女と(ry
0811デフォルトの名無しさん
2005/06/23(木) 17:34:35strrchrでもいけるとは漏れも初めて知った。
0812デフォルトの名無しさん
2005/06/23(木) 17:37:590813デフォルトの名無しさん
2005/06/23(木) 17:41:43strchrで'\0'検出はごく自然だけどね。
0814デフォルトの名無しさん
2005/06/23(木) 17:47:26FreeBSDのstrrchr(3)のmanには'\0'検出のことはちゃんと明言されてるな。
DESCRIPTION
The strrchr() function locates the last occurrence of c (converted to a
char) in the string s. If c is `\0', strrchr() locates the terminating
`\0'.
0815デフォルトの名無しさん
2005/06/23(木) 17:48:400816デフォルトの名無しさん
2005/06/23(木) 17:52:46とかでもいいけど
strchr()はなかなかエレガントだな
0817デフォルトの名無しさん
2005/06/23(木) 17:55:18同意
0818デフォルトの名無しさん
2005/06/23(木) 17:57:51もしかして
fgets()の改行切り捨てるのにも
buff[strlen(buff)-1] = '\0';
とか書く口?
0819812
2005/06/23(木) 18:05:340820815
2005/06/23(木) 18:13:54昔、そんな感じのコードを書いた記憶がありまつ
0821デフォルトの名無しさん
2005/06/23(木) 18:20:19それでも全然問題ないように見えるんだけど、ダメなの?
0822デフォルトの名無しさん
2005/06/23(木) 18:22:34fgets()の場合、末尾に必ず改行がついてるとは限らないので、よろしくない。
俺は常に
if (p = strchr(buff, '\n'))
*p = '\0';
だね。
0823デフォルトの名無しさん
2005/06/23(木) 18:23:51ウザい警告を出すコンパイラもあるけれど
0824デフォルトの名無しさん
2005/06/23(木) 18:25:14あぁ、そうか
stdinから読み込むことばかり考えてた
stdinからなら必ず改行が着くから無問題だよね?
0825デフォルトの名無しさん
2005/06/23(木) 18:33:480826デフォルトの名無しさん
2005/06/23(木) 18:42:140827デフォルトの名無しさん
2005/06/23(木) 18:57:59どこのOSですか?
0828デフォルトの名無しさん
2005/06/23(木) 19:32:230829デフォルトの名無しさん
2005/06/23(木) 19:44:540830デフォルトの名無しさん
2005/06/23(木) 19:52:56Windows NT系のcmd.exeはそういう挙動だと思った
command.comはもっと間抜け
0831デフォルトの名無しさん
2005/06/24(金) 01:18:08CP/M 思想を取り込んでいるOS
0832デフォルトの名無しさん
2005/06/24(金) 01:21:12きたときだけだった気がするけどなあ。
0833デフォルトの名無しさん
2005/06/24(金) 01:28:34マジ?????初耳w
0834へこぽん
2005/06/24(金) 02:54:06#include <stdio.h>
void print_bit(int na);
int count_bit(void);
int main(void)
{
int na;
printf("数値を入力");
scanf("%d",&na);
print_bit(na);
return 0;
}
/*ビット表示*/
void print_bit(int x)
{
int i;
for(i=count_bit()-1; i>=0; i--){
x>>=i;
printf("%d",(x & 1U )? '1' : '0');
}
}
/*ビットのカウント(桁)*/
int count_bit(void)
{
int i;
int count=0;
for(i=~0U; i>=0; i>>=1)
count++;
return count;
}
0835デフォルトの名無しさん
2005/06/24(金) 03:25:58Ctrl-v エスケープ記号を打ちます。(例: Ctrl-v ESC c Enter)
Ctrl-s 端末を固めます(XON)。
0836デフォルトの名無しさん
2005/06/24(金) 04:18:15count_bit
0837デフォルトの名無しさん
2005/06/24(金) 04:48:36データファイル(バイナリ)自体はリトルエンディアンで
いちいち1バイトずつ読み込むのは大変なんで
何か良い方法はありませんか?
0838デフォルトの名無しさん
2005/06/24(金) 05:30:49はて?
書くほうにhtonlとかで書くように頼めば?
0839デフォルトの名無しさん
2005/06/24(金) 05:53:064バイトとか細切れに読み取っていくしかなさそうで。
htonlは便利そうですね。もう書きましたが...。
レスありがとうございました。
0840デフォルトの名無しさん
2005/06/24(金) 10:50:0912 34 56 78
って言うファイルを
78 56 34 12
で読み取ってくるの?なんかすげーな。
0841デフォルトの名無しさん
2005/06/24(金) 12:32:33エンディアンについて勘違いしてる悪寒。
0842デフォルトの名無しさん
NGNG上位アドレスに下位ビットを配置する狂った思想。
データ列の解釈がアクセス幅に依存する。
0843デフォルトの名無しさん
2005/06/24(金) 14:39:270844デフォルトの名無しさん
2005/06/24(金) 15:06:360845デフォルトの名無しさん
2005/06/24(金) 15:12:01C言語使い→ビックエンディアン支持
0846デフォルトの名無しさん
2005/06/24(金) 15:20:53シークの仕方は先頭からだが
変数へバイトデータを入れるのはエンディアンで変わるだろ
0847デフォルトの名無しさん
2005/06/24(金) 15:54:07そのクラスの宣言部分を含んだファイルをincludeするしかないんでしょうか。
class hoge{
int A;
public:
int ShowA(void);
}
int hoge::ShowA(void){
return A
}
というクラスがあったとして、
extern class hoge;
extern int hoge::ShowA(void);
みたいな事がしたいのですが…。
0848デフォルトの名無しさん
2005/06/24(金) 15:56:20だから普通はヘッダに宣言を書いてcppには関数本体だけを置くようにする。
0849';'抜けているよ
2005/06/24(金) 15:58:57class hoge{
int A;
public:
int ShowA(void){return A;}
};
0850デフォルトの名無しさん
2005/06/24(金) 16:02:07char *tmp;
ofstream to("test");
if(!to.is_open()) return 0;
to<<str<<endl;
to.close();
ファイルにconst char *型の文字列を出力しようとすると、ofstreamのあとに内容が変わるんですけど、何か間違ってるんでしょうか
0851デフォルトの名無しさん
2005/06/24(金) 16:02:10やっぱりそうするしかないですか…。
どうもありがとうございます。
>>849
う、書いてから気づきました。
そういうふうに書いてもインライン関数になるんですね。
0852デフォルトの名無しさん
2005/06/24(金) 16:21:10strが初期化されて無いぞ
0853デフォルトの名無しさん
2005/06/24(金) 16:46:57なら、十は「01」で百は「001」か?
0854デフォルトの名無しさん
NGNG機械が解釈する場合はその方が都合がいい。
0855デフォルトの名無しさん
2005/06/24(金) 17:36:24エンディアンをわかってないね。
0856デフォルトの名無しさん
2005/06/24(金) 17:42:02何が言いたいかわかりせん。
0857デフォルトの名無しさん
2005/06/24(金) 17:42:450858デフォルトの名無しさん
2005/06/24(金) 17:43:280859デフォルトの名無しさん
2005/06/24(金) 17:57:55あのさぁ、
char* p={0x12,0x34,0x56,0x78};
がエンディアンによって
p[0]=0x78
p[1]=0x56
p[2]=0x34
p[3]=0x12
なんてなるわけ無いだろ。
0860デフォルトの名無しさん
2005/06/24(金) 18:08:28リトルエンディアンだったら
a = 1
だけど
ビッグエンディアンであれば
a = 0x100
で結局はエンディアン都合でデータ変わるって。
そのバイト区切りの配列の例は、例になってません。
せめて、0x12345678とかにしないと
エンディアン影響ゼロ
0861デフォルトの名無しさん
2005/06/24(金) 18:12:16読めない?
0862デフォルトの名無しさん
2005/06/24(金) 18:13:51>>859の説明で充分だと思うが。
0863デフォルトの名無しさん
NGNG自然言語の読み進む方向を「上位」と定義するならアラビア語とかは(数値の表記も含めて)
リトルエンディアンということになるわけだが。
0864デフォルトの名無しさん
2005/06/24(金) 18:17:32っていうテキストファイル読み込んだらエンディアンによって
"gfedcba"
になるって言ってんだろ>>846は。
0865デフォルトの名無しさん
NGNG「変数a」のアクセス幅は?
0866デフォルトの名無しさん
2005/06/24(金) 18:24:180867デフォルトの名無しさん
NGNGロードとストアでアクセス幅が同じならば、データ列のイメージはエンディアンに依存せず
同じになる。
0868デフォルトの名無しさん
2005/06/24(金) 19:08:15union{
int i;
char c[4];
};
};
VC++のデバッグで確認したら
i = 0x12345678
c[0] = 0x78,c[1] = 0x56,c[1] = 0x34,c[1] = 0x12
だった(;´Д`)
0869デフォルトの名無しさん
2005/06/24(金) 19:14:57ビックエンディアンだろうが同一機種ならなんも問題ない。
ビックエンディアンが不便なのは符号拡張をするときだ。
どっちだろうが a = 0x0001 とすれば1が入る。
メモリに書き出す時にその違いが出るのであって、
レジスタレベルでエンディアンが分別されることはない。
エンディアンの名前の由来はガリバー旅行記だ。
0870デフォルトの名無しさん
2005/06/25(土) 00:05:51だからエンディアンという。
0871デフォルトの名無しさん
2005/06/25(土) 00:18:55コンパイラはBorland C++ Compiler 5.5です。
#include <stdio.h>
main()
{
printf("こんにちは、世界");
}
というプログラム(hello.c)をコンパイルしようとしているのですが、何度やっても
C:\TM-C>bcc32 hello.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.c:
警告 W8070 hello.c 6: 関数は値を返すべき(関数 main )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: ファイル UUID.LIB が開けません
となってしまいます。どこが問題なのでしょうか?
0872デフォルトの名無しさん
2005/06/25(土) 00:28:42#include <stdio.h>
main()
{
printf("こんにちは、世界");
}
と書いてあったならそんな本は捨てること。今すぐ捨てること。
0873デフォルトの名無しさん
2005/06/25(土) 00:28:49あんたの頭。
0874デフォルトの名無しさん
2005/06/25(土) 00:29:16ilink32.cfgは書いた?
0875デフォルトの名無しさん
2005/06/25(土) 00:30:32なんで?
そのサンプル、K&Rの最初の例に酷似してると思うんだが
もしかして日本語リテラルをCソースコードに埋め込むのが我慢ならない人?
0876デフォルトの名無しさん
2005/06/25(土) 00:33:360877871
2005/06/25(土) 00:38:03それは、あまりにくだらないことを書いたテキストであるということでしょうか?
それとも、私がテキストを写し間違えたということでしょうか?
>873
確かに頭にも問題が多々ありますが、ご指導願えませんか?
>874
はい。
0878デフォルトの名無しさん
2005/06/25(土) 00:38:080879デフォルトの名無しさん
2005/06/25(土) 00:38:56偏屈野郎の下らない宗教戦争みたいなもんだ、気にするな
0880デフォルトの名無しさん
2005/06/25(土) 00:40:19ilink32.cfgじゃなくて、bcc32.cfgじゃね?
書いたならその内容を張ってみろ。
0882デフォルトの名無しさん
2005/06/25(土) 00:46:05別に問題なさげに見えるな。
uuid.libだけ見つからないのはおかしい。
そのファイルを確認してみてくれ。
或いは再インスコした方が早いかもしれん。
その手のトラブルな気が少しするわ。
libにディスクチェックもしてみて。
0883871
2005/06/25(土) 00:46:55はい。ありがとうございます。
0884デフォルトの名無しさん
2005/06/25(土) 00:51:00腐ってるな、bccって
0885871
2005/06/25(土) 00:54:36どうもありがとうございました。
0887デフォルトの名無しさん
2005/06/25(土) 00:58:58そこの処理を書け
おそらくそこが間違っている
0888デフォルトの名無しさん
2005/06/25(土) 01:01:24悪いこたぁ言わねぇからstr定義辺りも含めて全文貼って味噌。
0889デフォルトの名無しさん
2005/06/25(土) 01:03:370890デフォルトの名無しさん
2005/06/25(土) 01:16:46猫おすすめ
0891デフォルトの名無しさん
2005/06/25(土) 02:14:25コンパイラにBorland C++ Compiler 5.5をインストールし設定しました。
2種類のcfgを設定し、コマンドプロンプトで「bcc32」「path」と入力し
確認?をしてみました。
で、実際にメモ帳にて「test.c」を作成しコンパイルを実行すると
test.cは見つかりません。という表示が出ます。
どこの設定が間違っているのでしょうか?
0892デフォルトの名無しさん
2005/06/25(土) 02:15:59つ http://pc8.2ch.net/pcqa/
0893デフォルトの名無しさん
2005/06/25(土) 02:18:17誘導ありがとうございます!
0894デフォルトの名無しさん
2005/06/25(土) 04:32:37グローバル変数の置かれる領域(名前は忘れた)のサイズも
コンパイラに指定することは可能なのでしょうか?
(コンパイラによっては)
グローバル変数の置かれる場所の専用語句が分かれば
検索できそうなのですが。
0895デフォルトの名無しさん
2005/06/25(土) 04:35:070896デフォルトの名無しさん
2005/06/25(土) 04:40:27可能。
>895の言うヤツで、これらをセグメントという。
0897デフォルトの名無しさん
2005/06/25(土) 05:30:54現在卒研で熱物質移動の可視化のために画像処理系の研究を
行っています。ソフトはC++Builder.6を使用しています。
そこで質問なのですがプログラミングのスキルが生産技術部
で役に立つのかどうかしりたくてここに書き込みました。
どうか回答宜しくお願いします。
0898デフォルトの名無しさん
2005/06/25(土) 07:56:340899デフォルトの名無しさん
2005/06/25(土) 09:31:020900デフォルトの名無しさん
2005/06/25(土) 10:37:32自動車メーカーなら開発部門でプログラミングしているかもしれない。
プログラミング能力よりも、物理知識の方が重要かもしれないけど。
0901デフォルトの名無しさん
2005/06/25(土) 15:23:050902デフォルトの名無しさん
2005/06/25(土) 15:56:520903デフォルトの名無しさん
2005/06/25(土) 18:38:41{
double x;
double y;
};
という構造体を配列にして、中の値を隣り合った配列の値とやり取りして
計算するようなプログラムを書いているのですが、実行後エラーが出て
質問に伺いました。
ques q[5];
ques *qp;
qp=(ques*)malloc(sizeof(ques)*5);
として
*(qp+i).x=q[i-1].x+q[i].x+q[i+1].x
などと連続計算して、printf関数で出力した後
q[i].x=(qp+i)->x
と再代入してから
free(qp)
とするという計算をしているのですが、
計算はしてくれるのですが(連続計算にしていますが
最後までやってくれます)、プログラムを閉じる段階でエラーが出てしまいます
何か消し忘れているのでしょうか?ご指導お願いします
0904デフォルトの名無しさん
2005/06/25(土) 18:43:38全文晒したら?
それはさておき、*(qp+i)はqp[i]に、(qp+i)->xはqp[i].xと書いた方が直感的だと思うが。
0905903
2005/06/25(土) 19:12:49#include<stdio.h>
#include<stdlib.h>
struct ques
{
double x;
double y
};
int main()
{
ques q[3];
ques *qp;
int count;
int i;
for(i=0;i<3;i++)
{
qp->x=0;
qp->y=0;//初期化です
}
q[0].x=2;
q[0].y=4;
q[1].x=0;
q[1].y=0;
q[2].x=1;
q[2].y=3;
0906デフォルトの名無しさん
2005/06/25(土) 19:21:34qp の初期化がないぞ。
0907903
2005/06/25(土) 19:35:32for(i=0;i<3;i++)
{
printf("q[%d].x=%lf,q[%d].y=%lf\n",i,q[i],x,i,q[i],y);
}
while(count<0)
{
qp=(ques*)malloc(sizeof(ques)*5);
qp[0].x=q[0].x+q[1].x;
qp[0].y=q[0].y+q[1].y;
qp[0].x=q[0].x+q[1].x+qp[2].x;
qp[0].y=q[0].y+q[1].y+qp[2].y;
qp[2].x=q[2].x+q[1].x;
qp[2].y=q[2].y+q[1].y;
for(i=0;i<3;i++)
{
printf("q[%d].x=%lf,q[%d].y=%lf\n",i,qp[i],x,i,qp[i],y);
q[i].x=qp[i].x;
q[i].y=qp[i].y;
}
count++;
}
return 0;
}
>>905この内容だと、qp自身の初期化はどこで行うべきでしょうか
0908デフォルトの名無しさん
2005/06/25(土) 19:36:40qp = q;
とでもやるんだな
0910デフォルトの名無しさん
2005/06/25(土) 20:26:28cinとcoutで>>と<<の区別が付かない。
うまい覚え方ってないかな?自分の中ではこれが壁だ。
後はif文でどう使えばうまくいけるのかとかあるけど、本格的に迷っているのは>>と<<の区別。
これさえうまくいけば後はうまくいけると思う。
0911デフォルトの名無しさん
2005/06/25(土) 20:30:01矢印だと思えばいいだろ。
//文字列aaaをcoutに送る
cout << "aaa";
//cinの内容をxに送る
cin >> x;
//うはwwwwwwうんこwwwww
"aaa" >> cout;
0912デフォルトの名無しさん
2005/06/25(土) 20:30:240913デフォルトの名無しさん
2005/06/25(土) 20:32:46マニュピレータでごちゃごちゃやんの、ウゼエんだよ
printfでぜんぜん困ってない
まあsprintfよりはstrstream、なのか?という気はせんでもないが
MFCユーザとかだと、みなCString#Format()だろうな
0914デフォルトの名無しさん
2005/06/25(土) 20:39:43CString::CString( const char*,...)
static CString CString::Format( const char *, ...)
みたいなのが無いんだろう……
0915デフォルトの名無しさん
2005/06/25(土) 20:40:430916デフォルトの名無しさん
2005/06/25(土) 20:44:26それそれ。もうstrstreamなんていらないね。
0917デフォルトの名無しさん
2005/06/25(土) 22:00:160918デフォルトの名無しさん
2005/06/26(日) 00:16:43○ stringstream
0919デフォルトの名無しさん
2005/06/26(日) 00:22:160920デフォルトの名無しさん
2005/06/26(日) 00:49:14cout << tmp << endl;
これで0x19と出るが
unsigned int *tmp = abc->def;
cout << *tmp << endl;
これだとセグメンテーション違反と言われます。
これはどんな原因が考えられますか?
0x19からsizeof(unsigned int)分のデータの中に不正なデータがあるということでしょうか?
でも数値として解釈して出力するだけだからどんなビット列でも良いはずだし・・・
0921デフォルトの名無しさん
2005/06/26(日) 00:55:34表示されたエラーメッセージの意味ぐらい調べような。
0922デフォルトの名無しさん
2005/06/26(日) 00:57:22C言語 ポインタ でぐぐれ
0923デフォルトの名無しさん
2005/06/26(日) 01:15:36保護機能がちゃんと働くOSなら、エラーになって強制停止させられるでしょうな
0924デフォルトの名無しさん
2005/06/26(日) 01:52:15っ[ AnsiString& AnsiString::sprintf(const char* format, ...) ]
0925デフォルトの名無しさん
2005/06/26(日) 09:31:41現在はTeraPadというソフトを使っているのですが、若干使いづらいので。
0926デフォルトの名無しさん
2005/06/26(日) 09:44:170927デフォルトの名無しさん
2005/06/26(日) 10:22:360928デフォルトの名無しさん
2005/06/26(日) 10:26:05そういう質問するときは「若干使いづらいので」と思っている理由を明確にする。
それが出来ないなら、窓の杜やVectorで一覧当たるのと得られる情報は変わらない。
プログラマならemacsかvi。
それで満足できないなら、どんなフリーのエディタを使っても満足できないと思う。
0929デフォルトの名無しさん
2005/06/26(日) 10:52:43プログラマならemacsかvi。
プログラマならemacsかvi。
プログラマならemacsかvi。
プログラマならemacsかvi。
プログラマならemacsかvi。
プログラマならemacsかvi。
プログラマならemacsかvi。
0930デフォルトの名無しさん
2005/06/26(日) 10:59:270931デフォルトの名無しさん
2005/06/26(日) 11:26:02emacs系ならxyzzyが手頃。vi系ならviviかな。
Windowsらしいインターフェースがいいなら桜エディタとかPeggyかな。
0932デフォルトの名無しさん
2005/06/26(日) 11:31:46int main()
{
union
{
char ch;
int i;
};
return 0;
}
こういう共用体があったときに、
ch = 0;
i = 0;
というように全部の値を初期化する必要があるのですか?
それとも ch = 0; と書くだけで、よりサイズが大きなメンバも一緒に初期化してくれるのでしょうか?
0933デフォルトの名無しさん
2005/06/26(日) 11:34:03union HOGE
{
char ch;
int i;
};
int main()
{
HOGE hoge;
memset(&hoge, 0, sizeof(HOGE));
return 0;
}
0934デフォルトの名無しさん
2005/06/26(日) 11:37:10{
union
{
char ch;
int i;
} HOGE;
memset(&hoge, 0, sizeof(hoge));
return 0;
}
0935デフォルトの名無しさん
2005/06/26(日) 11:41:25レスありがとうございます。
なるほどsizeof してからmemset()するべきですか。
そのように実装します、助かりました〜。
0936デフォルトの名無しさん
2005/06/26(日) 11:59:39浮動小数点数とかポインタとか入れたときは memset() じゃぁダメ(かもしれない)。
0937デフォルトの名無しさん
2005/06/26(日) 12:14:25>>934
オマエそんな宣言してないhogeを操作しようとしてるソースを書くんじゃねぇ
0938デフォルトの名無しさん
2005/06/26(日) 12:17:50浮動小数点数とかポインタとかを memset で 0 埋めしても
0 で初期化したことにはならない(かもしれない)。
0939デフォルトの名無しさん
2005/06/26(日) 12:18:21{
union
{
char ch;
int i;
} hoge = {0};
return 0;
}
0940デフォルトの名無しさん
2005/06/26(日) 12:20:24932です、もう少し質問させて下さい。
union HOGE
{
char ch;
int i;
float f;
};
int main()
{
HOGE hoge;
memset(&hoge, 0, sizeof(HOGE));
//判定
if(hoge.f == 0) printf("初期化されたよ \n");
return 0;
}
こういうように書いても判定がうまく行かない(場合がある)ということでしょうか?
もしそうなら初期化に依存したソースは書かない方がよさげですね。
0941デフォルトの名無しさん
2005/06/26(日) 12:20:51それぞれの型に合わせた初期化関数を用意しなけりゃならんだろ。
0942デフォルトの名無しさん
2005/06/26(日) 12:56:230943デフォルトの名無しさん
2005/06/26(日) 13:03:56union HOGE {
char ch[sizeof(int)];
int i;
};
じゃなくて大丈夫なの?
0944デフォルトの名無しさん
2005/06/26(日) 13:05:350945デフォルトの名無しさん
2005/06/26(日) 13:13:44IEEE754では0.0fが0x00000000になることが保証されていますが?
0946デフォルトの名無しさん
2005/06/26(日) 13:21:200947デフォルトの名無しさん
2005/06/26(日) 13:21:38プログラミング言語CおよびC++では保証されていない。
0948デフォルトの名無しさん
2005/06/26(日) 13:24:05組込み系では0にジャンプするとリセットしたりするからな。
IEEEの話はあくまでそれを採用してるプロセッサの上での話しだが、
いまさら標準でない(IBM形式とか)の為に騒ぐ必要もなかろう。
0949デフォルトの名無しさん
2005/06/26(日) 13:29:39この流れで、IEEEが「標準」であるかのような言い方は感心できんな。
0950デフォルトの名無しさん
2005/06/26(日) 13:30:37CおよびC++で754以外の浮動小数点を扱ってる処理系とプロセッサを挙げよ。
現存するもので。
保証されていないのは確かだが、保証されることを期待して実装する訳ではないし、
保証されることが目的でもない。
実質的な標準を軸にして判断するのが、妥当だとは思わないか?
0951デフォルトの名無しさん
2005/06/26(日) 13:33:310952デフォルトの名無しさん
2005/06/26(日) 13:43:20そんな処理系もプロセッサも知らないんで、挙げられないよ。
でもそれは言語での保証が無いこととはまったく関係ないよ。
あんたが言語としての保証を必要としないのはわかった。
でもそれは言語での保証が無いこととは関係ないよ。
(あんたがC/C++標準委員会のコアメンバーでもなければね。)
0953デフォルトの名無しさん
2005/06/26(日) 14:01:16ちょっと不毛だった。
ただな、言語での保証が無いこととは関係ないが、実装には関係する。
浮動小数点に限らず、規定されていない範囲のことがな。
漏れはそういう視点から話してた訳。
0954デフォルトの名無しさん
2005/06/26(日) 14:22:36>>943
unionが何なのか知らんだろオマエ
0955デフォルトの名無しさん
2005/06/26(日) 14:39:15このスレは機種依存OKだから、標準が外れていることを指摘しつつも
現実的な回答をするのが筋だろうな。つまり、数学者的な思考を提示
しつつも工学者的な選択枝を提供する、と。だから、>>945と>>947は
反発しあう必要もなく、両方の意見を聞いて、結局どうするべきかは
質問者が決めればいい。
0956デフォルトの名無しさん
2005/06/26(日) 16:17:51はぁ…?
知ってるからこそビット幅合わせないで
一体どんな目的に使うのか謎なんだけど
0957デフォルトの名無しさん
2005/06/26(日) 16:27:55unionの存在意義がわかってないな
0958デフォルトの名無しさん
2005/06/26(日) 16:30:39char と int を重ねるってだけでも十分意味を成す場面があるだろう。
自分の知っている特定用途以外想像できないのを偉そうに言うなよ。
0959デフォルトの名無しさん
2005/06/26(日) 16:54:07大抵うまくいくだろうが、一応規格外だ。
こういうのも見るけど、規格外なんだよな。
union {
struct { float v[3]; } vec;
struct { float x, y, z; } elem;
};
0960デフォルトの名無しさん
2005/06/26(日) 17:03:25何が言いたいのかわからんな。
&vec.v[1] == &elem.y が保証されてないって話か?
char と int を重ねたいだけの話には関係ないんじゃない?
0961デフォルトの名無しさん
2005/06/26(日) 17:10:29もちろん引数は使わないで。
下記のようなことがしたいのですが……
void sub_func()
{
int x=x_main;
}
void main_func()
{
int x_main=255;
sub_func();
}
0962デフォルトの名無しさん
2005/06/26(日) 17:11:29>959は、きっと自分だけしか知らないノウハウを基準に>958を解釈しているんだよ。
0963デフォルトの名無しさん
2005/06/26(日) 17:12:46それができるのならローカル変数の意味がなくなってしまう。
どうしても引き数で渡すのがいやなら外部で定義するかC++ならクラスを利用しろ。
0964デフォルトの名無しさん
2005/06/26(日) 17:13:45無理
グローバル変数を経由するとかすればできるけど
つうかそんな事できたらグローバル変数とかわらんだろ
0965デフォルトの名無しさん
2005/06/26(日) 17:14:50なんじゃこりゃーって感じだった
0966デフォルトの名無しさん
2005/06/26(日) 17:17:23環境依存だけど
0967デフォルトの名無しさん
2005/06/26(日) 17:41:320968デフォルトの名無しさん
2005/06/26(日) 17:43:370969デフォルトの名無しさん
2005/06/26(日) 17:51:040970デフォルトの名無しさん
2005/06/26(日) 17:59:09union 使って↓な使い方することがあるんだよ。
つまり、union 内の型の間で変換はせず、サイズ節約のために使う。
そして >958 を読んでその意味を噛み締めてくれ。
typedef strcut {
enum { CHAR, INT, FLOAT, STRING } tag;
union {
char c;
int n;
float f;
char *str;
} data;
} VARIANT;
void func(VARIANT v)
{
switch(v.tag) {
case CHAR:
printf("%c", v.c);
break;
case INT:
printf("%d", v.n);
break;
}
}
0971970
2005/06/26(日) 18:03:03v.c じゃなくて v.data.c、v.n じゃなくて v.data.n だな。
自分でやるときには無名共用体を使うから間違えた。
0972デフォルトの名無しさん
2005/06/26(日) 18:23:16Emacs Lisp とか Perl とか。
ttp://ja.wikipedia.org/wiki/動的スコープ
なのでやっぱり >968 なんじゃね?
0973デフォルトの名無しさん
2005/06/26(日) 20:02:34std::vector<char> v に対して '0' '0' '0' '1' '5' の順で push_back() したいとき
(またはそれと等価な結果を得たいとき)
エレガントな方法は?
0974デフォルトの名無しさん
2005/06/26(日) 20:08:03size_t const end = v.size();
v.resize(end + 5 + 1);
sprintf(&v[end], "%05u", x);
v.resize(end + 5);
0975デフォルトの名無しさん
2005/06/26(日) 20:26:43で?それと、char c[sizeof(int)]となんの関係があると?
0976959
2005/06/26(日) 21:06:38いや、別に、ごく一般的なunionの用法なんですが・・・。
975と被るが、それとchar c[sizeof(int)]と何の関係があるの?
てっきりintをバイト単位でアクセスできることかと思ってたんだが。
それとも3バイト埋めることが合理的という事?
0977デフォルトの名無しさん
2005/06/26(日) 21:14:55970はLPARAM WPARAMなどを扱うWin系
959はWin以外の何かの畑の人とみた
0978デフォルトの名無しさん
2005/06/26(日) 21:17:050979デフォルトの名無しさん
2005/06/26(日) 21:18:04ワード境界に整列するようにアロケートしたいときとかに使うぐらいかな
malloc()の実装とかだと、さらにdoubleとかもメンバに入れるよな
>>970の例が、一番典型的なunionの使い方だと思う
型フィールド付+メモリ節約
まあ、C++なら邪悪とされるスタイルだが
0980デフォルトの名無しさん
2005/06/26(日) 21:27:250982デフォルトの名無しさん
2005/06/26(日) 21:52:530983デフォルトの名無しさん
2005/06/26(日) 21:55:12のはなんで?
0984デフォルトの名無しさん
2005/06/26(日) 21:56:19型フィールドみたいなものを使うぐらいなら継承を使え
というのがBjarne Stroustrup様の有難い教えです
0985デフォルトの名無しさん
2005/06/26(日) 21:56:200986デフォルトの名無しさん
2005/06/26(日) 21:56:240987デフォルトの名無しさん
2005/06/26(日) 21:59:04オブジェクトにして渡した方がいいって話とかじゃないかな、switchいらんし。
先の例ではメンバが増えると、caseも増える。
0988デフォルトの名無しさん
2005/06/26(日) 21:59:36型で決められたメソッドを敢えて場合分けの嵐にする設計が美しくない。
というかC++の設計思想に反する。
0989デフォルトの名無しさん
2005/06/26(日) 21:59:500990デフォルトの名無しさん
2005/06/26(日) 22:03:480991デフォルトの名無しさん
2005/06/26(日) 22:07:190992デフォルトの名無しさん
2005/06/26(日) 22:20:53入門書にのっている例文で有効そうなのは見つかりませんでした
そこからは見えない関数を渡してあげる以外に有効な方法ありますでしょうか?
0993デフォルトの名無しさん
2005/06/26(日) 22:22:020994デフォルトの名無しさん
2005/06/26(日) 22:22:270995デフォルトの名無しさん
2005/06/26(日) 22:23:470996デフォルトの名無しさん
2005/06/26(日) 22:24:570997992
2005/06/26(日) 22:37:380998デフォルトの名無しさん
2005/06/26(日) 22:39:070999デフォルトの名無しさん
2005/06/26(日) 22:45:43http://pc8.2ch.net/test/read.cgi/tech/1119793525/
1000デフォルトの名無しさん
2005/06/26(日) 22:46:22int main()
{
std::cerr << "1000" << std::endl;
return 0;
}
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。